我使用以下代码捕获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()只是向所有要关闭的线程发送一条消息。如何向程序指出应忽略此错误(因为它已被处理)?
提前致谢!
答案 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
。