0

我使用以下代码来捕获我的 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() 只是向所有线程发送一条消息以关闭。我如何向程序表明它应该忽略这个错误(因为它已经被处理了)?

提前致谢!

4

2 回答 2

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());
    }

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

于 2013-07-31T15:38:16.980 回答
0

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

相反,使用Environment.Exit.

于 2013-07-31T15:42:57.460 回答