Каково различие между AppDomain. UnhandledException и Приложение. DispatcherUnhandledException в.NET?
Мне нужно событие, которое запущено, когда любое необработанное исключение происходит. Я столкнулся с этими двумя, но я не знаю, по каким путям они отличаются друг от друга. Кроме того, есть ли случаи, когда они не уволены?
Application.DispatcherUnhandledException
будет обрабатывать исключения, брошенные на главный поток UI в приложении WPF. AppDomain.UnhandledException
будет обрабатывать исключения, брошенные в любом потоке и никогда не пойманные. Сюда входят потоки, которые вы создаете вручную, или главный поток в консольном приложении. WPF перехватывает исключения в потоке пользовательского интерфейса, поэтому вы не увидите их в AppDomain.UnhandledException
.
Также обратите внимание, что необработанные исключения обычно завершают выполнение, поэтому после появления AppDomain.UnhandledException
ваша программа немедленно завершится. Напротив, Application.DispatcherUnhandledException
перехватывает исключения и позволит вашей программе продолжить работу.
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 - для всего остального.
Надеюсь, это поможет!
DispatcherUnhandledException возникает только потоком пользовательского интерфейса и только в том случае, если исключение было вызвано во время выполнения события. Есть небольшая традиция специально обрабатывать такие исключения, в Windows Forms это тоже есть с Application.ThreadException (плохо названо, не имеет отношения к потокам).
Причина в том, что существует незначительный шанс обработать исключение и сохранить программу в рабочем состоянии, поскольку обработчики событий пользовательского интерфейса не всегда слишком сильно изменяют состояние программы. Это требует больших порций принятия желаемого за действительное. Windows Forms доводит это до крайности, отображая ThreadExceptionDialog с кнопкой «Продолжить», позволяя пользователю игнорировать исключение. WPF этого не делает, вам придется написать такой диалог самостоятельно. Поэтому и есть мероприятие.
По умолчанию DispatcherUnhandledException не перехватывает исключение. Так что вы можете проигнорировать это, следующим срабатывает исключение AppDomain.UnhandledException.