Как перехватить ВСЕ исключения / сбои в приложении .NET [дублировать]

StackOverflow https://stackoverflow.com/questions/82483

  •  01-07-2019
  •  | 
  •  

Вопрос

Возможный Дубликат:
.NET - каков наилучший способ реализовать “обработчик всех исключений”

У меня есть приложение .NET console app, которое выходит из строя и отображает сообщение пользователю.Весь мой код находится в try{<code>} catch(Exception e){<stuff>} блокируется, но все равно время от времени отображаются ошибки.

В приложении Win32 вы можете фиксировать все возможные исключения / сбои, устанавливая различные обработчики исключений:

/* C++ exc handlers */
_set_se_translator
SetUnhandledExceptionFilter
_set_purecall_handler
set_terminate
set_unexpected
_set_invalid_parameter_handler

Что является эквивалентом в .Сетевом мире, чтобы я мог обрабатывать / регистрировать / утилизировать все возможные случаи ошибок?

Это было полезно?

Решение

Вопреки тому, что опубликовали некоторые другие, нет ничего плохого в том, чтобы перехватывать все исключения.Важно обращаться со всеми ними надлежащим образом.Если у вас переполнение стека или не хватает памяти, приложение должно закрыться из-за них.Кроме того, имейте в виду, что условия ООМ могут помешать корректной работе вашего обработчика исключений.Например, если ваш обработчик исключений отображает диалоговое окно с сообщением об исключении, если у вас закончилась память, ее может не хватить для отображения диалогового окна.Лучше всего зарегистрировать его и немедленно выключить.

Как упоминали другие, существуют события UnhandledException и ThreadException, которые вы можете обрабатывать для сбора исключений, которые в противном случае могли бы быть пропущены.Затем просто запустите обработчик исключений вокруг вашего основного цикла (при условии, что это приложение winforms).

Кроме того, вы должны знать, что исключения OutOfMemoryExceptions не всегда выбираются для условий нехватки памяти.Условие ООМ может вызывать всевозможные исключения в вашем коде или во фреймворке, которые не обязательно имеют какое-либо отношение к тому факту, что реальному базовому условию не хватает памяти.Я часто видел исключение InvalidOperationException или ArgumentException, когда основной причиной на самом деле является нехватка памяти.

Другие советы

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

Эта статья в codeproject написана нашим ведущим Джеффом Этвудом это то, что вам нужно.Включает код для перехвата необработанных исключений и наилучшие методы отображения информации о сбое пользователю.

Тот Самый Глобальный.asax класс - это ваша последняя линия обороны.Посмотрите на:

protected void Application_Error(Object sender, EventArgs e)

способ

Имейте в виду, что некоторые исключения опасно отлавливать - или в основном их невозможно отловить,

  • Исключение OutOfMemoryException:все, что вы делаете в обработчике catch, может выделить память (на управляемой или неуправляемой стороне CLR) и, таким образом, вызвать другой ООМ
  • Исключение StackOverflowException:в зависимости от того, обнаружила ли среда CLR это достаточно рано, вы можете получить уведомление.В худшем случае это просто убивает процесс.

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

Хотя и ловящий ВСЕ исключения без плана по их правильной обработке, безусловно, являются плохой практикой, я думаю, что приложение должно завершиться сбоем каким-то изящным способом.Сбой не должен пугать пользователя до смерти, и, по крайней мере, он должен отображать описание ошибки, некоторую информацию для сообщения сотрудникам технической поддержки и, в идеале, кнопку для закрытия приложения и его перезапуска.В идеальном мире приложение должно иметь возможность сбрасывать на диск пользовательские данные, а затем пытаться восстановить их (но я вижу, что это требует слишком многого).

Во всяком случае, я обычно использую:

AppDomain.CurrentDomain.UnhandledException

Вы также можете использовать приложение.Событие ThreadException.

Однажды я разрабатывал .NET-приложение, работающее внутри приложения на базе COM;это событие было очень полезным, так как AppDomain.CurrentDomain.Необработанное исключение в этом случае не сработало.

Я думаю, вам лучше даже не перехватывать все исключения, а лучше позволить им быть показанными пользователю.Причина этого в том, что вы должны перехватывать только те исключения, с которыми вы действительно можете справиться.Если вы столкнетесь с каким-либо исключением, которое приведет к остановке программы, но все равно ее перехватит, это может вызвать гораздо более серьезные проблемы.Также читайте Вопросы и ответы:Почему FxCop предупреждает о перехвате (Исключении)?.

Имейте в виду, что перехват этих необработанных исключений может изменить требования к безопасности вашего приложения.Ваше приложение может перестать корректно работать в определенных контекстах (при запуске из общего сетевого ресурса и т.д.).Обязательно тщательно протестируйте.

не помешает использовать и то, и другое AppDomain.CurrentDomain.Необработанное исключение Application.ThreadException

но имейте в виду, что исключения во вторичных потоках не перехватываются этими обработчиками;использование Безопасная резьба для вторичных потоков, если это необходимо

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top