有没有人在C#Windows窗体应用程序中有一个经过验证的全局异常处理公式?

时间:2011-08-22 17:32:04

标签: c# .net

全球意义“在一个地方”,例如不是多次尝试...捕获,例如在每个事件处理程序上经证实的“已知工作” - 我知道涵盖.NET和其他异常并不简单。

感谢。

解决方案根据以下答案进行编码。

注意:这被认为涵盖了其他线程的异常。

static class Program
{
    static void MyHandler(Exception e)
    { MessageBox.Show(e.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
    }

    static void MyThreadExceptionEventHandler(object sender, ThreadExceptionEventArgs args)
    { MyHandler(args.Exception);
        // App continues.
    }

    static void MyAppExceptionHandler(object sender, UnhandledExceptionEventArgs args)
    { MyHandler((Exception)args.ExceptionObject);
        // There follows a OS "needs to close" dialog, terminating app.
    }

    static void Main()
    {

        // For UI thread exceptions
        Application.ThreadException += 
            new ThreadExceptionEventHandler(MyThreadExceptionEventHandler);

        // Force all Windows Forms errors to go through our handler.
        Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);

        // For non-UI thread exceptions
        AppDomain.CurrentDomain.UnhandledException +=
            new UnhandledExceptionEventHandler(MyAppExceptionHandler);

        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new Form1());
    }
}

3 个答案:

答案 0 :(得分:3)

默认行为,当它在未处理的异常上显示错误对话框并终止是一个很好的公式。如果您不喜欢此对话框的外观,则可以显示own instead,但principle是相同的(例如here):

public static void Main(string[] args)
{
    // Add the event handler for handling UI thread exceptions to the event.
    Application.ThreadException 
          += new ThreadExceptionEventHandler(/* YOUR OWN HANDLER */);

    // Set the unhandled exception mode to force all 
    // Windows Forms errors to go through our handler.
    Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);

    // Add the event handler for handling non-UI thread exceptions to the event. 
    AppDomain.CurrentDomain.UnhandledException +=
        new UnhandledExceptionEventHandler(/* YOUR OWN HANDLER */);

    // Runs the application.
    Application.Run(new /* YOUR MAIN FORM*/);
}

通常,异常处理没有神奇的“解决方案” - 在调用任何方法之前,您必须thinkhandling个特定异常。在这方面,Windows Forms没有什么特别之处。

答案 1 :(得分:2)

处理AppDomain.CurrentDomain.UnhandledException和Application.ThreadException你应该很好!

答案 2 :(得分:0)

使用可在配置文件中调整的异常处理应用程序阻止和异常策略。我喜欢它,但在考虑非常小的项目时,某人可能“太沉重”。