为什么我的Catch块仅在Visual Studio中进行调试时运行?
Program.cs中的代码
[STAThread] static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); try { Application.Run(new Form1()); } catch (Exception ex) { MessageBox.Show("Blah..."); } }
在Form1中,我有一个按钮,代码throw new Exception("");
。
如果我从Visual Studio运行应用程序,则会弹出我的消息框(消息’Blah …’)。 但是如果我从可执行文件运行应用程序,那么catch块根本不会执行。
为什么不同?
我使用的是Visual Studio 2010,.NET 4.0,Windows XP。
这是因为当附加Visual Studio调试器时,Windows窗体应用程序的标准exception处理行为有所不同 – 通常, Application.Run
方法中内置的exception处理Application.Run
捕获未处理的exception,以便它可以执行以下操作:
如果它允许在Application.Run
方法之外抛出exception,那么如果用户按下“继续”(因为catch在消息泵之外),它将阻止应用程序继续。
但是在调试时会禁用它,大概是调试器会在未处理的exception上直接跳转到调试模式,而不是显示上面的对话框。
如果您希望在Windows窗体应用程序中处理未处理的exception,则应该处理Application.ThreadException
事件 。 或者,您可以使用Application.SetUnhandledExceptionMode
方法更改此行为。
你绝不会因此而感到困惑:
- 是否可以尝试/捕获整个C#程序?
- 发布模式下的exception处理问题 (此问题误导性地命名 – 这与发布/调试构建设置无关)
- C#exception仅在调试时被捕获?
因为在RELEASE模式下,必须显示消息框,所以应用程序将“死”并且您无法通过显示MessageBox来阻止它。 在DEBUG模式下,VS关心它并在抛出exception的行上中断 。
问候。
我不明白为什么会这样,但尝试重建解决方案,如果有疑问,我总是那样做。 它可能会或可能不会解决问题,你可能已经尝试过,但如果你没有,它可能会为你修复它。