2

我正在开发一个使用 plain 实现的项目threads。应用程序中的大多数预期异常都得到了处理,但是,在某些情况下,其中一个线程抛出了意外异常并且应用程序只是崩溃了(应用程序既是基于I/O也是Client-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永远不会被调用。不幸的是,我无法更改应用程序的结构,这意味着我无法使用任务并行库。我不明白为什么这不起作用。有没有其他方法来处理线程中抛出的异常?任何帮助表示赞赏。

4

1 回答 1

4

你的方法是正确的。但是,您将无法阻止您的应用程序终止。

当您在应用程序中创建的线程上引发未处理的异常时,CurrentDomain_UnhandledException将调用允许您记录或报告异常。但是,除非e.IsTerminating是,否则false您将无法阻止您的应用程序终止。您可以在托管线程中的异常中阅读有关此行为的更多信息。

如果你发现它CurrentDomain_UnhandledException从未被调用,你应该验证它Application_Startup被调用来设置处理程序。

如果您仍然遇到问题,您应该验证它Utilities.DisplayUnhandledException不会引发异常。这也将导致您的申请立即终止。特别是,如果e.ExceptionObject不是类型Exception转换它Exception会抛出异常。但是,在正常情况下,当异常对象不是托管异常时,它会被包裹在一个RuntimeWrappedException.

为避免应用程序终止,您需要在线程方法的“堆栈顶部”捕获异常。如果由于您无权访问代码而无法做到这一点,则未处理的异常表明软件存在错误,即使不方便,当发现软件错误时最好的做法是终止应用程序以避免损坏.

于 2013-06-20T00:34:46.120 回答