调试控制台应用程序时,Visual Studio 陷入异常报告循环中。为什么?

3

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

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多次加载,然后查看输出。你会看到很多“未处理的异常”消息,尽管代码实际上只抛出了一次异常。调试器导致异常被抛出多次!这就是我觉得奇怪的地方。

4个回答

5

您期望什么?

考虑以下方法:

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调试时,您无法退出应用程序。

如果您没有连接调试器,则由于未处理的异常,您的应用程序当然会崩溃,但这是另一回事。


1
我期望的是按下F5会退出程序...我猜你说的有某种道理。 - Matthew Watson

1

它不会这样做。如果应用程序没有在调试器中运行,您将会得到一个“应用程序意外退出”的对话框 - 但在Visual Studio中不会出现。

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

否则,是的,您需要显式停止应用程序。


0

VS2012调试器无法继续处理未处理的异常


-1

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接