2010-07-09 2 views
20

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

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

ответ

11

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

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

+7

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

+0

Приложение не будет существовать, если исключение поймано и обработано.Как ответ, так и комментарий подразумевают, что в любом случае приложение выйдет, что не так. – vikp

2

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

говорит:

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

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

говорит:

«Это событие может быть обработано в любой области применения, однако, событие не обязательно поднят в домене приложения, где произошло исключение..»

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

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

8

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

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

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