生成时禁止未处理的错误c#

本文关键字:错误 未处理 禁止 | 更新日期: 2023-09-27 18:25:49

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

提前感谢!

生成时禁止未处理的错误c#

后面总是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());
    }

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

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

相反,请使用Environment.Exit