suppress未处理的错误c#生成时

suppress未处理的错误c#生成时,c#,.net-4.0,error-handling,C#,.net 4.0,Error Handling,我使用以下代码捕获VS2012 C#程序中任何未处理的错误: 在事件处理程序中,我向用户显示一条消息,在某些情况下,我会向自己发送电子邮件,发送StackTrace,然后始终发送Application.Exit() 在这个例子中 throw new System.Exception("Parameter cannot be null"); 错误处理程序被成功调用,但在调试时,在调用“我的错误处理程序”后,仍会突出显示未处理的错误。我可以理解这可能是开发环境的正确行为。然而,在构建项目时,它会做

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

在事件处理程序中,我向用户显示一条消息,在某些情况下,我会向自己发送电子邮件,发送StackTrace,然后始终发送
Application.Exit()

在这个例子中

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

我知道Application.Exit()只是向所有线程发送一条消息来关闭。我如何向程序指示它应该忽略此错误(因为它已经被处理)

提前谢谢

始终后跟一个Application.Exit()

这只会启动应用程序的关闭。也可以使用FormClosing事件处理程序取消它。显然,如果要立即关闭应用程序,请改用Environment.Exit()

还要注意,您不希望应用程序类捕获异常。因此,请改用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());
    }

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

实际上,
应用程序.Exit
只会告诉WinForms主线程消息泵关闭。如果由于错误,该消息泵已损坏,则该消息不会起任何作用。另外,任何自定义线程都不会关心它


相反,请使用
Environment.Exit

您是否使用了任何非托管资源或任何可能的第三方库?听起来好像没有正确处理某些内容。实际上,
应用程序.Exit
只会告诉WinForms主线程消息泵关闭。如果由于错误,该消息泵已损坏,则该消息不会起任何作用。另外,任何自定义线程都不会关心它。相反,请使用
Environment.Exit
。不,资源/库端没有任何内容,因为只是为application.Environment设置了初始框架。退出工作完美。非常感谢简@Jandorernhaus-很好的电话,Jan.你应该把它作为一个答案发布。
    [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());
    }