为什么这最终没有执行?

时间:2011-08-05 13:06:46

标签: c#

.net 4控制台应用示例

当我在vs 2010中运行时,它似乎继续投掷(从捕获)并且永远不会到达终点。它打破了抛出并显示异常,我点击f5并且它几乎像它在抛出时的循环一样重新抛出。在另一个exe中使用类似的代码我能够将异常抛出到控制台并执行finally来清理。事实并非如此,我想知道为什么。

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

4 个答案:

答案 0 :(得分:10)

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

Catch

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

答案 1 :(得分:2)

我敢打赌,终于实际执行了,但是在控制台应用程序的Main方法中,最后控制台对象不再可用。

答案 2 :(得分:2)

如果我通过调试启动程序,代码将停止并显示消息“未处理的异常”,这是在最终执行之前。不经调试运行将按预期工作(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");
    }
}

答案 3 :(得分:0)

你可以保证它确实在执行,就像@David Heffernan用他的输出所证明的那样;但是,您可能会考虑C#规范(8.10)中的内容,以确信应该是:

  

finally块的语句总是在控制时执行   留下一个尝试声明。无论控制转移都是如此   作为执行a的结果,由于正常执行而发生   中断,继续,转到或返回语句,或者作为结果   从try语句中传播异常。