Разница между UnhandledException и DispatcherUnhandledException в .NET - PullRequest
23 голосов
/ 09 июля 2010

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

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

Ответы [ 3 ]

12 голосов
/ 09 июля 2010

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

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

8 голосов
/ 09 июля 2010

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

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

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

2 голосов
/ 09 июля 2010

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

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

...