C# 是否存在阻止未处理异常对话框在我编译的应用程序中显示的设置?

C# 是否存在阻止未处理异常对话框在我编译的应用程序中显示的设置?,c#,.net,visual-studio-2010,C#,.net,Visual Studio 2010,我不确定这是不是该问的地方,但无论如何我会问的 我有2个.NET应用程序;一个是我自己编的,另一个不是。两者都使用.NETFramework4.5。但它们处理异常的方式不同 在我没有编译的应用程序中;它显示了未处理的异常对话框(我想要和期望的) 但在应用程序中我编译了;它只是显示应用程序已经崩溃 因此,VS配置或项目配置中必须有一个设置,以防止未处理的异常对话框显示在我编译的应用程序中 我尝试过重新安装VS,更改了调试->异常菜单中的设置,但都不起作用…顶部屏幕截图是ThreadExcept

我不确定这是不是该问的地方,但无论如何我会问的

我有2个.NET应用程序;一个是我自己编的,另一个不是。两者都使用.NETFramework4.5。但它们处理异常的方式不同

在我没有编译的应用程序中;它显示了未处理的异常对话框(我想要和期望的)

但在应用程序中我编译了;它只是显示应用程序已经崩溃

因此,VS配置或项目配置中必须有一个设置,以防止未处理的异常对话框显示在我编译的应用程序中


我尝试过重新安装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);