c# - 为什么我的 Catch block 仅在 Visual Studio 中调试时运行?

标签 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...");
    }
}

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

如果我从 Visual Studio 运行该应用程序,则会弹出我的消息框(带有消息“Blah...”)。但是,如果我从可执行文件运行应用程序,则 catch block 根本不会执行。

为什么不同?

我正在使用 Visual Studio 2010、.NET 4.0、Windows XP。

最佳答案

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

Error dialog

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

然而,在调试时这是禁用的,大概是为了调试器会在出现未处理的异常时直接跳转到 Debug模式,而不是显示上面的对话框。

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

您绝不是唯一一个对此感到困惑的人:

关于c# - 为什么我的 Catch block 仅在 Visual Studio 中调试时运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6734287/

相关文章:

c# - Linq从其他列表性能中选择匹配列表

c# - 键值对协方差

c# - .NET 中的无效或意外参数应该抛出哪些异常?

c# - PathGeometry 的非 GUI 替代品?

c# - 使用命名空间和加载

c# - 想要在警报框中显示变量的值

python - Python 中的停止迭代

.net - Python 中 .Net InvalidOperationException 的类比是什么?

.net - 为什么 Task.Delay() 允许无限延迟?

.net - 我应该针对哪个版本的 .NET 框架?