C# 为什么这最终无法执行?

C# 为什么这最终无法执行?,c#,C#,.NET4控制台应用程序示例 当我在VS2010中运行这个时,它似乎一直在投掷(从接球开始),而且永远不会到达终点。它在抛出时中断并显示异常,我点击f5,它几乎像抛出时的循环一样重新旋转。在另一个exe中使用类似的代码,我能够将异常抛出到控制台并执行finally来清理。事实并非如此,我想知道为什么 static void Main(string[] args) { try { throw new Exception("Except

.NET4控制台应用程序示例

当我在VS2010中运行这个时,它似乎一直在投掷(从接球开始),而且永远不会到达终点。它在抛出时中断并显示异常,我点击f5,它几乎像抛出时的循环一样重新旋转。在另一个exe中使用类似的代码,我能够将异常抛出到控制台并执行finally来清理。事实并非如此,我想知道为什么

static void Main(string[] args)
    {
        try
        {
            throw new Exception("Exception");
        }
        catch(Exception)
        {
            Console.WriteLine("Catch");
            throw;
        }
        finally
        {
            Console.WriteLine("Finally");
        }
    }

相反,它确实执行
finally
块。这是输出:

Catch

Unhandled Exception: System.Exception: Exception at ConsoleApplication1.Program.Main(String[] args) in C:\Desktop\ConsoleApplication1\Program.cs:line 24
Finally

我敢打赌finally确实执行了,但是在控制台应用程序的主方法中,在finally中,控制台对象不再可用。

如果我通过调试启动程序,代码将停止并显示消息“unhandled exception”,这是finally将执行之前的消息。在不进行调试的情况下运行将按预期工作(CTRL-F5)

使用调试器,您可以通过将测试代码移动到另一个try-catch块中来验证最终执行的测试代码,例如:

static void Main(string[] args)
{      
    try
    {
        Method();
    }
    catch (Exception)
    {
        Console.WriteLine("caught in main");
    }
    Console.ReadKey();
}
public static void Method()
{
    try
    {
        throw new Exception("Exception");
    }
    catch (Exception)
    {
        Console.WriteLine("Catch");
        throw;
    }
    finally
    {
        Console.WriteLine("Finally");
    }
}

您可以保证它确实在执行,正如@davidheffernan用他的输出所展示的那样;但是,你可以考虑C语言规范(8.10)中所说的话,以便确信应该是:

finally块的语句总是在控制时执行 留下一个try语句。无论控制权是否转移,都是如此 作为正常执行的结果,作为执行 中断、继续、转到或返回语句,或作为 从try语句传播异常


它应该写“Catch”,然后写“Finally”,然后因为异常而崩溃。这不是发生了什么吗?它是循环的,因为在catch语句中,您抛出了相同的异常。@ramhound呃,不,一旦您处于
catch
,那么抛出不会让您回到
catch
部分的开头!我同意,我看到了相同的结果。在我的测试中,添加一个断点表明情况就是这样——它肯定会最终命中目标。可能控制台已经停止监听了。我在OP代码的finally块中没有遇到任何问题。