代码之家  ›  专栏  ›  技术社区  ›  Will Dean

在WPF应用程序中使用WinForms默认异常处理程序

  •  2
  • Will Dean  · 技术社区  · 15 年前

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

    WPF应用程序似乎没有得到这样好的异常处理——您总是必须退出应用程序。

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

    2 回复  |  直到 13 年前
        1
  •  3
  •   itowlson    15 年前

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

    有关第一部分,请参见application.dispatcherUnhandledException。如果订阅此事件,并且事件处理程序将DispatcherUnhandledExceptionEventArgs.handled设置为true,则WPF将跳过默认的未处理异常处理,即应用程序不会自动关闭。(当然,事件处理程序仍然可以关闭它。)默认情况下,handled未设置为true,因此必须显式执行此操作。

    有关第二部分,请参见System.Windows.Forms.ThreadExceptionDialog。这是正式的“不打算从您的代码中使用”,并且没有以任何有用的方式记录下来,所以在生产应用程序中依赖它是不明智的。但是,如果您愿意冒险,那么您可以创建这个类的一个实例,并将其显示为showDialog()。在.NET 3.5中,它返回dialogresult.cancel,表示“忽略异常并继续”,dialogresult.abort,表示“退出”。这些值没有记录,但应该作为实现细节处理!

        2
  •  3
  •   Will Dean    15 年前

    好的,我在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的引用,并且可能需要在应用程序类上稍微使用名称空间,但是其他人可能会发现它对于简单的实用程序很有用。