Program.cs中的代码
[STAThread] static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); try { Application.Run(new Form1()); } catch (Exception ex) { MessageBox.Show("Blah..."); } }
在Form1中,我有一个按钮,代码抛出新的异常(“”);.
如果我从Visual Studio运行应用程序,我的消息框弹出(消息“Blah …”).但是如果我从可执行文件运行应用程序,那么catch块根本就不执行.
为什么有区别?
我使用的是Visual Studio 2010,.NET 4.0,Windows XP.
解决方法
这是因为Windows Forms应用程序的标准异常处理在附加Visual Studio调试器时的行为不同 – 通常,Application.Run方法中内置的异常处理程序捕获未处理的异常,以便可以执行以下操作:
如果允许将异常抛出到Application.Run方法之外,那么如果用户按“继续”(因为catch位于消息泵外),则会阻止应用程序继续.
当调试时,这被禁用,大概是这样,调试器将在未处理的异常而不是上面显示的对话框中直接跳转到调试模式.
如果您希望在Windows Forms应用程序中处理未处理的异常,那么您应该处理Application.ThreadException
Event.或者您可以使用Application.SetUnhandledExceptionMode
Method更改此行为.
你绝对不会因此而迷惑:
> Is try/catch around whole C# program possible?
> Exception handling problem in release mode(这个问题是误导性的 – 这与发布/调试构建设置无关)
> C# Exceptions only caught when debugging?