Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Завершение процесса при возникновении исключения 
:(
    Опции темы
V0fka
Дата 22.12.2014, 17:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 311
Регистрация: 5.11.2006
Где: Украина

Репутация: нет
Всего: нет



Привет!

Есть программа на WPF. Что она делает сейчас описывать не буду, т.к. мне кажется это для решения проблемы не важно. Периодически программа выкидывает исключение. Причину определить не могу и иногда месяцами работает без сбоев, а иногда вылетает по несколько раз в день. Пока было решено сделать костыль в виде отдельной программы, которая мониторит наличие соответствующего процесса и при его отсутствии - запускает нужный ехе-шник. Но уже после обнаружилась другая беда. Когда программа выкидывает исключение - процесс сходу не завершается. Сначала вываливается виндосовское окно, которое говорит о том, что где-то борода и сам процесс завершается только после того, как закроешь это окно.

Вопрос: можно как-то сделать, чтобы при возникновении исключения - процесс молча "сворачивался"?
PM MAIL   Вверх
chupachups
Дата 24.12.2014, 13:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 0
Регистрация: 15.10.2008

Репутация: нет
Всего: 1



копай в сторону перехвата событий Application.ThreadException и System.AppDomain.CurrentDomain.UnhandledException и в них делай закрытие приложения или просто пиши необработанное исключение в лог


Этот ответ добавлен с нового Винграда - http://vingrad.com
PM MAIL   Вверх
sgrey
Дата 25.12.2014, 00:10 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 265
Регистрация: 15.4.2006

Репутация: нет
Всего: 4



может вместо костылей лучше посмотреть логи винды, а также вставить лог ошибок в программу, и таки её отдебажить?
PM MAIL   Вверх
V0fka
Дата 26.12.2014, 10:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 311
Регистрация: 5.11.2006
Где: Украина

Репутация: нет
Всего: нет



chupachups, спасибо за ответ! Хотя кто-то, по-моему, в моей же какой-то теме на форуме говорил про эти события - но что-то я сам не допер попробовать использовать их сейчас. Сейчас сделал именно так. При их возникновении - пишу в лог что там было и закрываю приложение. Буду наблюдать.

sgrey, однозначно то о чем вы говорите - это лучше. Но в логах винды я ничего путевого не нашёл, что могло бы натолкнуть меня на какие-то варианты решения. Лог по совету chupachups-а вставил, надеюсь вставил куда положено и он поможет раскрыть мне этот ящик Пандоры. Но пока у меня не хватает ума определить где косяк. За ответ спасибо!
PM MAIL   Вверх
sgrey
Дата 28.12.2014, 03:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 265
Регистрация: 15.4.2006

Репутация: нет
Всего: 4



Цитата(V0fka @ 26.12.2014,  10:50)
chupachups, спасибо за ответ! Хотя кто-то, по-моему, в моей же какой-то теме на форуме говорил про эти события - но что-то я сам не допер попробовать использовать их сейчас. Сейчас сделал именно так. При их возникновении - пишу в лог что там было и закрываю приложение. Буду наблюдать.

sgrey, однозначно то о чем вы говорите - это лучше. Но в логах винды я ничего путевого не нашёл, что могло бы натолкнуть меня на какие-то варианты решения. Лог по совету chupachups-а вставил, надеюсь вставил куда положено и он поможет раскрыть мне этот ящик Пандоры. Но пока у меня не хватает ума определить где косяк. За ответ спасибо!

часто в лог винды записывается иерархия вызванных функций которые вызвали исключение или подробное описание что вылетело и почему. Вполне неплохое место чтобы попытаться понять в каких случаях оно может выскочить. 
Вообще по самому исключению можно предположить чего в программе делается когда она падает... Что за исключение вылетает хотябы известно?

PM MAIL   Вверх
V0fka
Дата 30.12.2014, 16:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 311
Регистрация: 5.11.2006
Где: Украина

Репутация: нет
Всего: нет



sgrey, мне повезло (если можно так сказать) и сегодня программа снова упала. Но кроме того, что снова упала - она во-первых поднялась без человеческого вмешательства, а во-вторых у меня появился лог вот такого содержания:

Цитата
System.Net.Sockets.SocketException (0x80004005): Удаленный хост принудительно разорвал существующее подключение
   at System.Net.Sockets.Socket.EndAccept(Byte[]& buffer, Int32& bytesTransferred, IAsyncResult asyncResult)
   at System.Net.Sockets.Socket.EndAccept(IAsyncResult asyncResult)
   at ХХХХХХХ.AsyncServer.AcceptCallback(IAsyncResult asyncResult) in ххххххх.cs:line ххх (на какую именно строчку ругается я ниже покажу)
   at System.Net.LazyAsyncResult.Complete(IntPtr userToken)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
   at System.Net.ContextAwareResult.Complete(IntPtr userToken)
   at System.Net.Sockets.BaseOverlappedAsyncResult.CompletionPortCallback(UInt32 errorCode, UInt32 numBytes, NativeOverlapped* nativeOverlapped)
   at System.Threading._IOCompletionCallback.PerformIOCompletionCallback(UInt32 errorCode, UInt32 numBytes, NativeOverlapped* pOVERLAP)


Раз пошла такая пьянка, то нужно рассказать по софтине что и как она делает.
Есть Socket, который слушает входящие подключения и отправляет их в обработку. Это если в двух словах. В коде это выглядит примерно так. Есть ManualResetEvent:

Код

private static ManualResetEvent connectionMutex = new ManualResetEvent(false);


По кнопке "Старт" выполняется следующее:

Код

acceptConnectionsThread = new BackgroundWorker();
acceptConnectionsThread.WorkerReportsProgress = true;
acceptConnectionsThread.WorkerSupportsCancellation = true;
acceptConnectionsThread.DoWork += new DoWorkEventHandler(ListenThread_DoWork);
acceptConnectionsThread.RunWorkerAsync(this.serverSocket); // this.serverSocket) - это тот самый сокет, который слушает входящие подключения


И вспомогательные функции:

Код

private void ListenThread_DoWork(object sender, DoWorkEventArgs e)
        {
            Socket serverSocket = (Socket)e.Argument;
            serverSocket.Listen(100);

            while (!acceptConnectionsThread.CancellationPending)
            {
                connectionMutex.Reset();
                serverSocket.BeginAccept(new AsyncCallback(AcceptCallback), this.serverSocket);
                connectionMutex.WaitOne();
            }

            e.Cancel = true;
        }

        private void AcceptCallback(IAsyncResult asyncResult)
        {
            if (acceptConnectionsThread.CancellationPending)
                return;

            connectionMutex.Set();
            Socket serverSocket = (Socket)asyncResult.AsyncState;
            Socket clientSocket = (Socket)serverSocket.EndAccept(asyncResult);
            clientSocket.ReceiveTimeout = clientReceiveTimeOut;

            this.clientManager.AddNewConnection(clientSocket);

        }


И в описании исключения ошибка припадает на строку
Код

Socket clientSocket = (Socket)serverSocket.EndAccept(asyncResult);

в функции AcceptCallback.

Теперь вопросы по сути:
1) Как это грамотно исправить? Кроме как обернуть содержимое функции AcceptCallback в try\catch - я не знаю что можно сделать ещё.
2) Решил я провести эксперимент. Создал BackgroundWorker и натравил его на метод, который просто выбрасывает исключение NotImplementedException. При этом в методе исключение возникает, но сама программа не выпадает. Почему же рабочая софтина выпадает при возникновении исключения в похожих условиях?
PM MAIL   Вверх
sgrey
Дата 30.12.2014, 18:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 265
Регистрация: 15.4.2006

Репутация: нет
Всего: 4



обернуть эту строку Socket clientSocket = (Socket)serverSocket.EndAccept(asyncResult); в try-catch, создать лог и записывать туда подробности исключения. Потом можно будет разобраться при каких условиях оно вылетает. Может только с одного адреса оно вылетает, или бот подключится пытается, или таймаут срабатывает
Потом ну и return не забыть в случае исключения

Почему поведение программы разное без кода сказать сложно - запуск внутри студии и на сервере -совсем разные вещи, и как там исключение вставлено тоже вопрос ))
PM MAIL   Вверх
V0fka
Дата 12.1.2015, 13:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 311
Регистрация: 5.11.2006
Где: Украина

Репутация: нет
Всего: нет



Цитата(sgrey @  30.12.2014,  18:05 Найти цитируемый пост)
обернуть эту строку Socket clientSocket = (Socket)serverSocket.EndAccept(asyncResult); в try-catch, создать лог и записывать туда подробности исключения.

А в таком случае информация будет более подробная, чем в том исключение, которое поймалось выше?
PM MAIL   Вверх
sgrey
Дата 12.1.2015, 23:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 265
Регистрация: 15.4.2006

Репутация: нет
Всего: 4



Цитата(V0fka @ 12.1.2015,  13:11)
Цитата(sgrey @  30.12.2014,  18:05 Найти цитируемый пост)
обернуть эту строку Socket clientSocket = (Socket)serverSocket.EndAccept(asyncResult); в try-catch, создать лог и записывать туда подробности исключения.

А в таком случае информация будет более подробная, чем в том исключение, которое поймалось выше?

Смотря что будешь писать в лог ))) Записывай всю доступную информацию и будет более подробно чем в исключении )) Например запиши адрес к/с которого было подключение, и другие вещи )
У тебя же там доступ есть ко всем объектам нужным - вот и бери всё что можешь из них. 

ну и ещё ты сможешь корректно завершить работу функции в этом случае

Это сообщение отредактировал(а) sgrey - 12.1.2015, 23:10
PM MAIL   Вверх
V0fka
Дата 14.1.2015, 10:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 311
Регистрация: 5.11.2006
Где: Украина

Репутация: нет
Всего: нет



sgrey, а, так... smile Так сделать я что-то не сообразил. В общем, пока программа работает стабильно. Буду наблюдать. При очередных вылетах посмотрю что в текущем логе будет. Если она вылетает в одном и том же месте, то воспользуюсь вашим советом. Спасибо за ответы!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0474 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.