是否有一个设置阻止未处理的exception对话框显示在我编译的应用程序中?

我不确定这是否是正确的地方,但无论如何我都会。

我有2个.NET应用程序; 一个是我自己编写的,另一个不是。 两者都使用.NET Framework 4.5。 但他们处理不同的例外。

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

来自应用程序的未处理异常我没有编译

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

从我编译的应用程序未处理的Exepction

所以VS配置或项目配置中必须有一个设置阻止未处理的exception对话框在我编译的应用程序中显示?…

我尝试重新安装VS,更改Debug-> Exceptions菜单中的设置,两者都没有…

顶部屏幕截图是一个ThreadExceptionDialog。 它显示在一个非常特殊的情况下,Winforms应用程序在消息循环(Application.Run)触发的事件处理程序中炸弹,并且应用程序没有重新分配Application.ThreadException事件处理程序。 使用它不是一个很好的做法,没有合理的方法用户可以知道是否单击继续或退出按钮。 一定要调用Application.SetUnhandledExceptionMode()来禁用它。

底部屏幕截图是默认的Windows错误报告对话框,当程序遭遇未处理的exception时,由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()方法来更改行为。

 public enum ErrorModes : uint { SYSTEM_DEFAULT = 0x0, SEM_FAILCRITICALERRORS = 0x0001, SEM_NOALIGNMENTFAULTEXCEPT = 0x0004, SEM_NOGPFAULTERRORBOX = 0x0002, SEM_NOOPENFILEERRORBOX = 0x8000, SEM_NONE = SEM_FAILCRITICALERRORS | SEM_NOALIGNMENTFAULTEXCEPT | SEM_NOGPFAULTERRORBOX | SEM_NOOPENFILEERRORBOX } [DllImport("kernel32.dll")] static extern ErrorModes SetErrorMode(ErrorModes uMode); 

然后打电话

 SetErrorMode(ErrorModes.SEM_NONE); 

这样做会给finally块提供运行的机会。