如何正确捕获WinForms应用程序中所有未处理的异常

时间:2015-09-04 09:07:03

标签: c# .net winforms exception

我想为WinForms应用程序中的任何线程设置所有未处理异常的处理程序方法。我不会自己创建任何应用程序域。

根据UnhandledException文档,我需要通过UnhandledExceptionMode.ThrowException方法设置Application.SetUnhandledExceptionMode模式来捕获主线程的异常:

  

在使用Windows窗体的应用程序中,未处理的异常   主应用程序线程导致Application.ThreadException事件   被提高。如果处理此事件,则默认行为是   未处理的异常不会终止应用程序,尽管如此   应用程序处于未知状态。在那种情况下,   不会引发UnhandledException事件。可以更改此行为   通过使用应用程序配置文件,或使用   Application.SetUnhandledExceptionMode方法将模式更改为   ThreadException事件之前的UnhandledExceptionMode.ThrowException   处理程序被连接起来。这仅适用于主应用程序   线。 UnhandledException事件是针对未处理的引发的   其他线程抛出异常

因此,生成的代码如下所示:

    public static void UnhandledExceptionEventHandler(object sender, UnhandledExceptionEventArgs e)
    {
        // ...
    }

    [STAThread]
    static void Main(string[] args)
    {
        Application.SetUnhandledExceptionMode(UnhandledExceptionMode.ThrowException);
        AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(UnhandledExceptionEventHandler);

        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new MainForm(pathToCheck));
    }

可以吗?它会从任何线程(包括主线程,UI线程和Task类创建的所有线程)中捕获所有未处理的异常吗?我是否正确理解了文档?

是的,我在这里看到了this之类的问题,但我不明白我为什么还要使用以下代码:

Application.ThreadException += new     
  ThreadExceptionEventHandler(ErrorHandlerForm.Form1_UIThreadException);

1 个答案:

答案 0 :(得分:1)

您应该订阅这两个活动。请注意,即使这样也不会自动捕获其他线程中的所有内容。例如,当异步调用委托时,只有在调用EndInvoke时,异常才会传播到调用者线程。

    [STAThread]
    static static void Main(string[] args)
    {
        AppDomain.CurrentDomain.UnhandledException +=
            (sender, args) => HandleUnhandledException(args.ExceptionObject as Exception);
        Application.ThreadException +=
            (sender, args) => HandleUnhandledException(args.Exception);
    }

    static void HandleUnhandledException(Exception e)
    {
        // show report sender and close the app or whatever
    }