【问题标题】:When debugging a console app, Visual Studio gets stuck in an exception-reporting loop. Why?调试控制台应用程序时,Visual Studio 陷入异常报告循环。为什么?
【发布时间】:2012-07-13 11:43:21
【问题描述】:

考虑这个简单的控制台应用程序:

using System;

namespace Demo
{
    class Program
    {
        static void Main(string[] args)
        {
            throw new Exception();
        }
    }
}

我在 Visual Studio 2010 或 Visual Studio 2012 Beta 的调试器下运行它。

当我这样做时,调试器自然会在异常处停止。到目前为止还好。

但是当我按 F5 继续(或选择调试|继续)时,它再次停止在同一个异常处。 我必须停止调试才能退出程序。当我按下 F5 时,我预计程序会退出。

有谁知道它为什么会这样?

[编辑]

我已将回复标记为答案,但要查看调试器行为的奇怪后果,请考虑以下代码:

using System;

namespace Demo
{
    class Program
    {
        static void Main(string[] args)
        {
            AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
            throw new Exception();
        }

        static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
        {
            Console.WriteLine("Unhandled Exception.");
        }
    }
}

在调试器下运行它并按 F5 多次,然后查看输出。你会看到很多“未处理的异常”消息,尽管代码实际上只抛出了一次。调试器导致异常多次抛出!这就是我觉得奇怪的地方。

【问题讨论】:

    标签: c# visual-studio-2010


    【解决方案1】:

    你期待什么?

    考虑以下方法:

    private void Test()
    {
        throw new Exception();  
        int u = 4;
    }
    

    当抛出异常时,调试器允许您导航到调用上下文以查看您的程序是否捕获到异常。如果不是这样,它永远不会通过跳过异常退出Test 方法,这就是int u = 4; 无法访问的原因。

    在你的例子中,它是一样的:

    private static void Main(string[] args)
    {
        throw new Exception();
    
        // If I'm here, I will exit the application !
        // But this place is unreachable
    }
    

    由于您的异常,您无法退出 Main 方法范围。这就是为什么在使用 F5 进行调试时无法退出应用程序的原因。

    如果您没有附加调试器,您的应用程序当然会因为未处理的异常而崩溃,但这是另一回事。

    【讨论】:

    • 我的预期是按 F5 会退出程序...我猜你说的有点道理。
    【解决方案2】:

    它不会那样做。如果应用程序没有在调试器中运行,您会看到“应用程序意外退出”对话框——但在 Visual Studio 中不会。

    虽然我不确定它为什么会这样,但可能是因为它让您可以选择将“当前执行的行”箭头​​(黄色数组)移动到应该执行的下一行并恢复操作。

    否则,是的,您需要明确停止应用程序。

    【讨论】:

      【解决方案3】:

      VS2012 调试器不会继续处理未处理的异常

      【讨论】:

        【解决方案4】:

        默认情况下,调试器会在所有未捕获(即未处理)的异常上停止 - 这可以在“异常”对话框中更改(CTRL+ALT+E,使用我的键绑定)

        【讨论】:

          猜你喜欢
          • 2021-06-30
          • 2012-09-18
          • 2013-12-29
          • 1970-01-01
          • 1970-01-01
          • 2016-04-11
          • 2019-11-29
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多