未捕获未处理的线程中抛出的异常

时间:2013-06-20 00:01:59

标签: c# wpf unhandled-exception

我正在开发一个使用普通threads实现的项目。处理应用程序中的大多数预期异常,但是,有些情况下其中一个线程抛出意外异常而应用程序崩溃(应用程序同时基于I/OClient-Server,所以它实际上是不可能处理所有例外)。

要解决此问题,我正在尝试定义全局UnhandledExceptionHandler,以便应用程序显示友好消息而不是崩溃。这就是我试过的:

public partial class App : Application
{
    private void Application_Startup(object sender, StartupEventArgs e)
    {
        AppDomain.CurrentDomain.UnhandledException +=
            new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);

        // The rest of the startup logic goes here
    }

    void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
    {
        Utilities.DisplayUnhandledException((Exception)e.ExceptionObject);
    }
}

但这不起作用。永远不会调用CurrentDomain_UnhandledException。不幸的是,我无法改变应用程序的结构,这意味着我无法使用任务并行库。我无法弄清楚为什么这不起作用。有没有其他方法来处理线程中抛出的异常?任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:3)

你的方法是正确的。但是,您将无法阻止您的申请终止。

当您在应用程序CurrentDomain_UnhandledException中创建的线程上抛出未处理的异常时,将调用该异常,允许您记录或报告异常。但是,除非e.IsTerminatingfalse,否则您将无法停止申请终止。您可以在Exceptions in Managed Threads中了解有关此行为的更多信息。

如果您发现永远不会调用CurrentDomain_UnhandledException,则应验证是否已调用Application_Startup来设置处理程序。

如果您仍然遇到问题,则应验证Utilities.DisplayUnhandledException是否不会引发异常。这也将导致您的申请立即终止。特别是,如果e.ExceptionObject不是Exception类型,则将其转换为Exception将引发异常。但是,在正常情况下,当异常对象不是托管例外时,it will be wrapped in a RuntimeWrappedException

为避免终止应用程序,您需要在线程方法的“堆栈顶部”捕获异常。如果由于您无法访问代码而无法实现,那么未处理的异常就会显示有问题的软件,即使发现软件错误最不方便的事情就是终止应用程序以避免损坏