Глобальная обработка исключений в оконном сервисе - PullRequest
4 голосов
/ 28 июня 2011

У меня есть служба Windows, запущенная в качестве сервера. Однако сервер иногда останавливается немедленно из-за ошибки, которая не обрабатывается. Пожалуйста, помогите мне, как обрабатывать глобальные исключения. Спасибо.

Ответы [ 2 ]

3 голосов
/ 28 июня 2011

Мне кажется, что вы пытаетесь решить проблему неправильно ...

Когда ваша программа (или служба) аварийно завершает работу из-за необработанной ошибки, решение состоит не в том, чтобы выяснить, где и как "обработать" все необработанные ошибки, чтобы вы могли их игнорировать и продолжить выполнение. Я более четко сформулировал эту точку зрения в этом ответе , но короткая версия заключается в том, что, когда вы сталкиваетесь с необработанным исключением, правильная вещь - это сбой . Как указано в оригинальном ответе:

Тот факт, что произошло необработанное исключение, означает, что сервер находился в непредвиденном состоянии. Уловив исключение и сказав: «Не волнуйтесь, все хорошо», вы в конечном итоге оставляете поврежденный сервер включенным.

[. , , ]

Для перехвата всех исключений и продолжения процесса предполагается, что сервер может восстановиться после непредвиденного сбоя. Но это абсурд. Вы уже знаете, что сервер невостребованный тост: он разбился!

Гораздо лучше разрешить сбой сервера, чтобы в момент сбоя можно было получить дамп сбоя. Теперь у вас есть шанс узнать, что происходит.

Таким образом, на самом деле решение real включает в себя выяснение первопричины необработанного исключения и изменение вашего кода, чтобы в первую очередь предотвратить возникновение этой ошибки.

Мы никак не можем помочь вам сделать это, если вы не опубликуете точное полученное сообщение об исключении, и желательно полную трассировку стека. Но вы определенно хотите сохранить полученную отладочную информацию, а не придумать способ полностью ее игнорировать - это единственный способ реально решить проблему.

Если вы все еще настаиваете на игнорировании всех благонамеренных советов об обратном, вы найдете подход «совать голову в песок и игнорировать его» * ​​1029 * подробно здесь .

0 голосов
/ 28 июня 2011

Вы можете попробовать использовать событие AppDomain.CurrentDomain.UnhandledException, хотя я не уверен, будет ли оно перехватывать каждое необработанное исключение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...