Хорошо, это просто:
В чем разница между
Application.ThreadException
иAppDomain.CurrentDomain.UnhandledException
?Мне нужно обрабатывать оба?
Спасибо!
источник
Хорошо, это просто:
В чем разница между Application.ThreadException
и AppDomain.CurrentDomain.UnhandledException
?
Мне нужно обрабатывать оба?
Спасибо!
Application.ThreadException относится к Windows Forms. Winforms запускает обработчики событий в ответ на сообщения, отправленные ему Windows. Например, событие Click, я уверен, вы их знаете. Если такой обработчик событий генерирует исключение, то внутри цикла сообщений Winforms есть обратная остановка, которая перехватывает это исключение.
Эта остановка вызывает событие Application.ThreadException . Если вы не переопределите его, пользователь получит ThreadExceptionDialog . Это позволяет ему игнорировать исключение и продолжать работу вашей программы. Кстати, не самая лучшая идея.
Вы можете отключить это поведение, вызвав Application.SetUnhandledExceptionMode () в методе Main () в Program.cs. Без этой поддержки происходит обычное дело, когда поток умирает из-за необработанного исключения: срабатывает AppDomain.UnhandledException, и программа завершается.
Fwiw: «ThreadException» было очень неудачным выбором имени. Это не имеет ничего общего с потоками.
Application.ThreadException
. Я поднял вопрос по этому поводу [здесь ] с помощью моего небольшого кода C #.Из источника :
Application.ThreadException
может быть обнаружен, и приложение может продолжить работу (в целом это не лучшая идея, но для приложения, например, периодически выполняющего некоторые действия, это хорошее решение).Чтобы перехватить исключения, возникающие в потоках, не созданных и не принадлежащих Windows Forms, используйте
AppDomain.UnhandledException
. Это позволяет приложению регистрировать информацию об исключении до того, как системный обработчик по умолчанию сообщит об исключении пользователю и завершит работу приложения.Обработка этого исключения не препятствует завершению работы приложения.
Максимум, что можно было сделать (данные программы могут быть повреждены, если исключения не обрабатываются), - это сохранить данные программы для последующего восстановления. После этого домен приложения выгружается, и приложение завершается.
Для получения дополнительных сведений см. MSDN .
источник
Хорошо - у меня это было передо мной, этот фрагмент кода из msdn довольно понятен:
источник
Дело в том, что
ThreadException
происходит из-за проблемы с вашим потоком,Unhandled Exception
запускается, если ваш код генерирует исключение, которое не обрабатывается.Самый простой способ вызвать второй - создать приложение без блоков try ... catch и выбросить исключение.
Теперь, если вам нужна страховка, вы можете справиться с ними обоими, однако, если вы
exceptions
правильноUnhandledException
поймаете и обработаете ее, вам не понадобится обработчик, поскольку это своего рода улов.источник