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

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

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

3 ответа

Решение

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

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

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

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

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

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 - для всего остального.

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

Другие вопросы по тегам