为什么我的Catch块仅在Visual Studio中进行调试时运行?

sve*_*vit 9 c# exception .net-4.0

Program.cs中的代码

[STAThread]
static void Main()
{
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);

    try
    {
        Application.Run(new Form1());
    }
    catch (Exception ex)
    {
        MessageBox.Show("Blah...");
    }
}
Run Code Online (Sandbox Code Playgroud)

在Form1中,我有一个带代码的按钮throw new Exception("");.

如果我从Visual Studio运行应用程序,则弹出我的消息框(消息'Blah ...').但是如果我从可执行文件运行应用程序,那么catch块根本不会执行.

为什么不同?

我使用的是Visual Studio 2010,.NET 4.0,Windows XP.

Jus*_*tin 16

这是因为当附加Visual Studio调试器时,Windows窗体应用程序的标准异常处理行为会有所不同 - 通常,Application.Run方法中内置的异常处理程序会捕获未处理的异常,以便它可以执行以下操作:

错误对话框

如果它允许在Application.Run方法之外抛出异常,那么如果用户按下"继续"(因为捕获在消息泵之外),它将阻止应用程序继续.

但是在调试时会禁用它,大概是调试器会在未处理的异常上直接进入调试模式,而不是显示上面的对话框.

如果您希望在Windows窗体应用程序中处理未处理的异常,那么您应该处理该Application.ThreadException事件.或者,您可以使用Application.SetUnhandledExceptionMode方法更改此行为.

你绝不会因此而感到困惑: