Разница между 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 - для всего остального.
Надеюсь, это поможет!