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

在WPF应用程序中使用winforms默认异常处理程序,wpf,winforms,exception-handling,Wpf,Winforms,Exception Handling,对于简单的“仅供内部使用”应用程序,Winforms有一个有用的默认异常处理程序,它允许“忽略”,并告诉您异常是什么 WPF应用程序似乎没有得到这样好的异常处理-您总是必须退出应用程序 显然,我可以为WPF编写自己的默认异常处理程序,但是有没有一种简单的方法可以使用Winforms框架中必须已经存在的异常处理程序,但是有了WPF?好的,我翻遍了Winforms源代码,结果发现标准Winforms异常对话框是公共的。因此,您需要使用WPF样式的DispatcherUnhandledExceptio

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

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


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

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

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

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


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

非常感谢,你写这篇文章的同时,我正在阅读资料。。。就像你说的,它绝对是“仅供内部使用”——我有点惊讶ThreadExceptionDialog竟然是公开的。