27

.NET 中的AppDomain.UnhandledExceptionApplication.DispatcherUnhandledException有什么区别?

我需要一个在发生任何未处理的异常时触发的事件。我遇到过这两个,但我不知道它们有什么不同。另外,有没有被解雇的情况?

4

3 回答 3

17

Application.DispatcherUnhandledException将处理 WPF 应用程序的主 UI 线程上引发的异常。 AppDomain.UnhandledException将处理在任何线程上抛出的异常并且永远不会被捕获。这包括您手动创建的线程或控制台应用程序中的主线程。WPF 在 UI 线程上捕获异常,因此您不会在AppDomain.UnhandledException.

另请注意,未处理的异常通常会终止运行时,因此AppDomain.UnhandledException引发后您的程序将立即退出。相反,Application.DispatcherUnhandledException正在捕获异常并将让您的程序继续运行。

于 2010-07-09T12:05:37.620 回答
9

DispatcherUnhandledException 仅由 UI 线程引发,并且仅在运行事件时引发异常时引发。专门处理这类异常有一些传统,Windows Forms 也有 Application.ThreadException (名字不好,与线程无关)。

原因是处理异常并保持程序活动的机会很小,因为 UI 事件处理程序并不总是过于剧烈地改变程序的状态。这需要大量的一厢情愿。Windows 窗体将这一点发挥到了极致,它显示了一个带有 Continue 按钮的 ThreadExceptionDialog,允许用户忽略异常。WPF 不这样做,您必须自己编写一个这样的对话框。这就是该事件存在的原因。

DispatcherUnhandledException 的默认操作是不捕获异常。所以你可以忽略它,AppDomain.UnhandledException 接下来会触发。

于 2010-07-09T12:21:54.793 回答
2

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

说:

“DispatcherUnhandledException 由应用程序针对在主 UI 线程上运行的代码未处理的每个异常引发。”

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

说:

“此事件可以在任何应用程序域中处理。但是,该事件不一定在发生异常的应用程序域中引发。”

所以 DispatcherUnhandledException 用于 UI 线程异常,而 AppDomain.UnhandledException 用于其他所有异常。

希望有帮助!

于 2010-07-09T12:07:41.263 回答