在构建时抑制未处理的错误c#

时间:2013-07-31 14:13:04

标签: c# .net-4.0 error-handling

我使用以下代码捕获VS2012 C#程序中的任何未处理错误:

Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException);

在事件处理程序中,我向用户显示一条消息,在某些情况下,我自己通过电子邮件发送StackTrace,后面跟着Application.Exit();

在示例中

throw new System.Exception("Parameter cannot be null");

错误处理程序已成功调用,但在调试时仍然会在调用错误处理程序后将错误突出显示为未处理。我可以理解这可能是开发环境的正确行为。然而,在构建项目时,它做了类似的事情,我的消息框/电子邮件被成功调用,但后来我从Windows 7获得了程序崩溃对话框(带有关闭/重新启动/调试选项)。

我理解Application.Exit()只是向所有要关闭的线程发送一条消息。如何向程序指出应忽略此错误(因为它已被处理)?

提前致谢!

2 个答案:

答案 0 :(得分:1)

  

后面始终是Application.Exit()

启动关闭应用程序。它也可以使用FormClosing事件处理程序取消。显然,您希望立即关闭应用程序,而是使用Environment.Exit()。

另请注意,您不希望Application类捕获异常。因此,请改用UnhandledExceptionMode.ThrowException。您现在不再需要为Application.ThreadException编写事件处理程序,现在所有中止都会通过AppDomain.UnhandledException事件。

请注意,此事件使调试变得困难,您仍希望异常助手帮助您在调试时诊断事故。所以让它有条件,像这样:

    [STAThread]
    static void Main() {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.SetUnhandledExceptionMode(UnhandledExceptionMode.ThrowException);
        if (!System.Diagnostics.Debugger.IsAttached) {
            AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
        }
        Application.Run(new Form1());
    }

如果要调试崩溃处理程序,请暂时禁用该测试。

答案 1 :(得分:0)

实际上,Application.Exit只会告诉WinForms主线程消息泵关闭。如果该消息泵已经因为错误而中断,则不会执行任何操作。此外,任何自定义线程都不会关心它。

相反,请使用Environment.Exit