【问题标题】:Using winforms default exception handler with WPF apps在 WPF 应用程序中使用 winforms 默认异常处理程序
【发布时间】:2009-10-26 09:48:52
【问题描述】:

对于简单的“仅供内部使用”的应用程序,Winforms 有一个有用的默认异常处理程序,它允许“忽略”,并告诉您异常是什么。

WPF 应用似乎无法获得这种出色的异常处理 - 您总是必须退出应用程序。

显然我可以为 WPF 编写自己的默认异常处理程序,但有没有一种简单的方法来使用必须已经在 Winforms 框架中但使用 WPF 的异常处理程序?

【问题讨论】:

    标签: wpf winforms exception-handling


    【解决方案1】:

    我认为这个问题有两个部分:如何连接您自己的异常处理程序以允许应用程序继续运行,以及是否可以重用 Windows 窗体未处理的异常 UI。

    对于第一部分,请参阅 Application.DispatcherUnhandledException。如果您订阅此事件,并且您的事件处理程序将 DispatcherUnhandledExceptionEventArgs.Handled 设置为 true,则 WPF 将跳过默认的未处理异常处理——即应用程序不会自动关闭。 (当然,您的事件处理程序仍然可以将其关闭。)Handled 默认未设置为 true,因此您必须明确执行此操作。

    关于第二部分,请参阅 System.Windows.Forms.ThreadExceptionDialog。这正式“不打算在您的代码中使用”,并且没有以任何有用的方式记录,因此在生产应用程序中依赖它是不明智的。但是,如果您愿意冒险,那么您可以创建此类的一个实例并 ShowDialog() 它。在 .NET 3.5 中,它返回 DialogResult.Cancel 表示“忽略异常并继续”,返回 DialogResult.Abort 表示“退出”。这些值未记录在案,但应视为实现细节!

    【讨论】:

    • 非常感谢 - 你是在我阅读源代码的同时写的......就像你说的,它绝对是“仅供内部使用” - 我有点惊讶 ThreadExceptionDialog 是完全公开。
    【解决方案2】:

    好的,我在 Winforms 源代码中四处寻找,结果发现标准的 Winforms 异常对话框是公开的。因此,您需要使用 WPF 样式的 DispatcherUnhandledException 处理程序,并执行以下操作:

    void App_DispatcherUnhandledException(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e)
    {
        using (ThreadExceptionDialog dlg = new ThreadExceptionDialog(e.Exception))
        {
            DialogResult result = dlg.ShowDialog();
            if (result == DialogResult.Abort)
            {
                Environment.Exit(-1);
            }
            else if (result == DialogResult.Cancel)
            {
                e.Handled = true;
            }
        }
    }
    

    您需要添加对 System.Windows.Forms 的引用,并且可能需要在您的应用程序类上稍微使用命名空间,但其他人可能会发现它对简单的实用程序应用程序很有用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-23
      • 1970-01-01
      相关资源
      最近更新 更多