suppress未处理的错误c#生成时
我使用以下代码捕获VS2012 C#程序中任何未处理的错误: 在事件处理程序中,我向用户显示一条消息,在某些情况下,我会向自己发送电子邮件,发送StackTrace,然后始终发送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"); 错误处理程序被成功调用,但在调试时,在调用“我的错误处理程序”后,仍会突出显示未处理的错误。我可以理解这可能是开发环境的正确行为。然而,在构建项目时,它会做
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());
}