Подтвердить что ты не робот

Разница между UnhandledException и DispatcherUnhandledException в .NET.

В чем разница между AppDomain.UnhandledException и Application.DispatcherUnhandledException в .NET?

Мне нужно событие, которое запускается при возникновении любого необработанного исключения. Я столкнулся с этими двумя, но я не знаю, как они отличаются друг от друга. Кроме того, существуют случаи, когда они не срабатывают?

4b9b3361

Ответ 1

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

Также обратите внимание, что необработанные исключения обычно завершают среду выполнения, поэтому после AppDomain.UnhandledException повышается ваша программа немедленно выйдет. Напротив, Application.DispatcherUnhandledException ловит исключения и продолжит вашу программу.

Ответ 2

DispatcherUnhandledException генерируется только потоком пользовательского интерфейса и только в случае возникновения исключения при запуске события. Там немного традиций для обработки подобных исключений специально, Windows Forms имеет это тоже с Application.ThreadException(плохо названное, ничего общего с потоками).

Причина в том, что есть небольшой шанс обработать исключение и сохранить программу в живых, поскольку обработчики событий пользовательского интерфейса не всегда слишком сильно изменяют состояние программы. Это требует больших усилий для принятия желаемого за действительное. Windows Forms делает это до крайности, он отображает ThreadExceptionDialog, который имеет кнопку "Продолжить", позволяя пользователю игнорировать исключение. WPF этого не делает, вам придется написать такой диалог самостоятельно. Вот почему событие есть.

Действие DispatcherUnhandledException по умолчанию - это не исключение. Итак, вы можете проигнорировать его, AppDomain.UnhandledException будет срабатывать следующим образом.

Ответ 3

http://msdn.microsoft.com/en-us/library/system.windows.application.dispatcherunhandledexception.aspx

говорит:

"DispatcherUnhandledException добавляется приложением для каждого исключения, которое не обрабатывается кодом, запущенным в основном потоке пользовательского интерфейса".

http://msdn.microsoft.com/en-us/library/system.appdomain.unhandledexception.aspx

говорит:

"Это событие можно обрабатывать в любом домене приложения. Однако это событие не обязательно возникает в домене приложения, в котором произошло исключение."

Так DispatcherUnhandledException для исключений потоков пользовательского интерфейса, а AppDomain.UnhandledException - для всего остального.

Надеюсь, что это поможет!