【问题标题】:Difference between UnhandledException and DispatcherUnhandledException in .NET.NET 中 UnhandledException 和 DispatcherUnhandledException 的区别
【发布时间】:2011-03-13 20:14:05
【问题描述】:

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

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

【问题讨论】:

    标签: c# .net wpf exception-handling unhandled-exception


    【解决方案1】:

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

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

    【讨论】:

    • 其实在不使用Application.DispatcherUnhandledException的时候,这些异常会出现在AppDomain.UnhandledException中,应用会立即退出。
    • 如果异常被捕获和处理,应用程序将不存在。回答和评论都暗示应用程序退出的任何一种方式都是错误的。
    【解决方案2】:

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

    说:

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

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

    说:

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

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

    希望有帮助!

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-05-16
        • 2013-02-02
        • 2021-11-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-08
        • 2010-11-11
        相关资源
        最近更新 更多