【问题标题】:Why is my Catch block only running while Debugging in Visual Studio?为什么我的 Catch 块仅在 Visual Studio 中调试时运行?
【发布时间】:2011-07-18 14:14:48
【问题描述】:

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。

【问题讨论】:

  • 在VS外运行会发生什么?如果按 Ctrl+F5 会发生什么? (无需调试即可运行)
  • 简短,不完整的答案:调试时发生的事情不同。请参阅此问题了解您应该做什么:stackoverflow.com/questions/1601372/…

标签: c# exception .net-4.0


【解决方案1】:

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

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

在调试时禁用此功能,大概是为了让调试器在出现未处理的异常时直接跳转到调试模式,而不是显示上述对话框。

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

对此感到困惑的绝非您一个人:

【讨论】:

    【解决方案2】:

    因为在 RELEASE 模式下,必须显示消息框的那一刻,你的应用程序将“死”,您无法通过显示 MessageBox 来阻止它。在 DEBUG 模式下,VS 关心这一点,并在引发异常的行上 breaks

    问候。

    【讨论】:

    • @Slaks:这里有什么错误?
    • 一切。你的答案没有一部分是真的。
    • 对不起,伙计们,但这里的问题不是他应该做什么,而是为什么在 RELEASE 中没有显示此代码的消息框。如果您对此有完整准确的答案,我将很乐意阅读。问候。
    • 1) 他没有运行发布模式。 2) catch 块在发布模式下工作正常 3) VS 在调试模式下没有中断;他看到了 MessageBox 4) 实际问题是默认的未处理异常处理程序,它在附加调试器时不会运行。
    • 我知道。他没有运行发布二进制文件。这并没有减少你的答案错误。
    【解决方案3】:

    我不明白为什么会发生这种情况,但尝试重建解决方案,如果有疑问我总是这样做。它可能会或可能不会解决问题,您可能已经尝试过,但如果您还没有尝试过,它可能会为您解决问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-01
      • 2019-05-25
      • 2018-10-28
      • 1970-01-01
      相关资源
      最近更新 更多