C# 是否存在阻止未处理异常对话框在我编译的应用程序中显示的设置?
我不确定这是不是该问的地方,但无论如何我会问的 我有2个.NET应用程序;一个是我自己编的,另一个不是。两者都使用.NETFramework4.5。但它们处理异常的方式不同 在我没有编译的应用程序中;它显示了未处理的异常对话框(我想要和期望的) 但在应用程序中我编译了;它只是显示应用程序已经崩溃 因此,VS配置或项目配置中必须有一个设置,以防止未处理的异常对话框显示在我编译的应用程序中C# 是否存在阻止未处理异常对话框在我编译的应用程序中显示的设置?,c#,.net,visual-studio-2010,C#,.net,Visual Studio 2010,我不确定这是不是该问的地方,但无论如何我会问的 我有2个.NET应用程序;一个是我自己编的,另一个不是。两者都使用.NETFramework4.5。但它们处理异常的方式不同 在我没有编译的应用程序中;它显示了未处理的异常对话框(我想要和期望的) 但在应用程序中我编译了;它只是显示应用程序已经崩溃 因此,VS配置或项目配置中必须有一个设置,以防止未处理的异常对话框显示在我编译的应用程序中 我尝试过重新安装VS,更改了调试->异常菜单中的设置,但都不起作用…顶部屏幕截图是ThreadExcept
我尝试过重新安装VS,更改了调试->异常菜单中的设置,但都不起作用…顶部屏幕截图是ThreadExceptionDialog。它显示在Winforms应用程序轰炸消息循环(Application.Run)触发的事件处理程序,并且应用程序没有重新分配Application.ThreadException事件处理程序的非常特定的情况下。使用它不是一个很好的实践,用户无法合理地知道是单击“继续”还是“退出”按钮。确保调用Application.SetUnhandledExceptionMode()以禁用它 底部屏幕截图是默认的Windows错误报告对话框,当程序在未处理的异常上爆炸时,Windows会显示该对话框。您不应该让它发展到这一点,对话框没有显示足够的信息来帮助任何人诊断和解决问题。始终为AppDomain.CurrentDomain.UnhandledException事件编写事件处理程序。显示和/或记录e.ExceptionObject.ToString()并调用Environment.Exit()终止应用程序 使您的Program.cs源代码类似于以下内容:
[STAThread]
static void Main() {
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.ThrowException);
AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
Application.Run(new Form1());
}
static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) {
// TODO: improve logging and reporting
MessageBox.Show(e.ExceptionObject.ToString());
Environment.Exit(-1);
}
Hans Passant提出的解决方案将终止该应用程序。这也意味着剩余的
finally
块不再执行
您还可以使用PInvoke通过调用方法来更改行为
然后打电话
SetErrorMode(ErrorModes.SEM_NONE);
这样做将使
最终
阻塞运行的机会。第一个是Winforms应用程序,它在UI线程上爆炸。第二个是,嗯,不是。这两个都是winforms应用程序,都在主线程上爆炸,go figure…这是有意义的,我强制崩溃测试在加载时引发异常,在表单中放置一个按钮,在单击按钮时引发异常调用未处理的异常对话框。您能否提供更多信息,说明我如何编写异常处理程序?ThanksInTesting副作用:一旦应用程序.Run
返回,您的线程异常处理程序可能不再订阅,并导致您看到线程异常对话框。如果您调用应用程序,请记住这一点。多次运行(首先可能不是一个好主意)。要仅禁用Windows错误报告对话框和崩溃报告,可以使用SetErrorMode(SetErrorMode(0)| ErrorModes.SEM_nogpfault terrorbox)
。
SetErrorMode(ErrorModes.SEM_NONE);