.NET 中的AppDomain.UnhandledException和Application.DispatcherUnhandledException有什么区别?
我需要一个在发生任何未处理的异常时触发的事件。我遇到过这两个,但我不知道它们有什么不同。另外,有没有被解雇的情况?
.NET 中的AppDomain.UnhandledException和Application.DispatcherUnhandledException有什么区别?
我需要一个在发生任何未处理的异常时触发的事件。我遇到过这两个,但我不知道它们有什么不同。另外,有没有被解雇的情况?
Application.DispatcherUnhandledException
将处理 WPF 应用程序的主 UI 线程上引发的异常。 AppDomain.UnhandledException
将处理在任何线程上抛出的异常并且永远不会被捕获。这包括您手动创建的线程或控制台应用程序中的主线程。WPF 在 UI 线程上捕获异常,因此您不会在AppDomain.UnhandledException
.
另请注意,未处理的异常通常会终止运行时,因此AppDomain.UnhandledException
引发后您的程序将立即退出。相反,Application.DispatcherUnhandledException
正在捕获异常并将让您的程序继续运行。
DispatcherUnhandledException 仅由 UI 线程引发,并且仅在运行事件时引发异常时引发。专门处理这类异常有一些传统,Windows Forms 也有 Application.ThreadException (名字不好,与线程无关)。
原因是处理异常并保持程序活动的机会很小,因为 UI 事件处理程序并不总是过于剧烈地改变程序的状态。这需要大量的一厢情愿。Windows 窗体将这一点发挥到了极致,它显示了一个带有 Continue 按钮的 ThreadExceptionDialog,允许用户忽略异常。WPF 不这样做,您必须自己编写一个这样的对话框。这就是该事件存在的原因。
DispatcherUnhandledException 的默认操作是不捕获异常。所以你可以忽略它,AppDomain.UnhandledException 接下来会触发。
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 用于其他所有异常。
希望有帮助!