[英]Why is my Catch block only running while Debugging in 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。
这是因为 Windows Forms 应用程序的标准异常处理在附加 Visual Studio 调试器时表现不同 - 通常, Application.Run
方法中内置的异常处理程序会捕获未处理的异常,以便它可以执行类似显示以下对话框的操作:
如果它允许在Application.Run
方法之外引发异常,那么如果用户按下“继续”,它将阻止应用程序继续(因为捕获位于消息泵之外)。
然而,在调试时,它被禁用,大概是为了调试器将在未处理的异常上直接跳转到调试模式,而不是显示上述对话框。
如果您希望在 Windows Forms 应用程序中处理未处理的异常,那么您应该处理Application.ThreadException
事件。 或者,您可以使用Application.SetUnhandledExceptionMode
方法更改此行为。
对此感到困惑的绝不是您一个人:
因为在RELEASE模式下,消息框必须显示你的应用程序将“死”,你不能通过显示 MessageBox 来阻止它。 在调试模式下,VS 关心这一点,并在引发异常的行中断。
问候。
我不明白为什么会发生这种情况,但尝试重建解决方案,如果有疑问我总是这样做。 它可能会或可能不会解决问题,您可能已经尝试过,但如果您还没有尝试过,它可能会为您解决问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.