在C#中嵌套try-finally

Koc*_*vid 22 c# try-catch

为什么不是"Console.WriteLine("asdf");" 执行?所有其他人都是.难道不是因为我们不能从最终范围跳出来吗?

static bool Func()
{
    try
    {
        try
        {
        }
        finally
        {
            try
            {
                throw new ApplicationException();
            }
            finally
            {
                Console.WriteLine("asd");
            }

            Console.WriteLine("asdf");
        }
    }
    finally
    {
        Console.WriteLine("asd");
    }
}
Run Code Online (Sandbox Code Playgroud)

Jon*_*yna 27

最后,块仅保证(至少主要保证,除了下面的MSDN之外),在try块抛出异常的情况下输入它们.如果 finally块中抛出异常,则异常将导致控制离开finally块,并且该finally块中的其余代码将不会执行.

在您的情况下,未执行的行发生在同一个finally块中的异常之后,因此会跳过它.

MSDN - try-finally:

最后的块是有用的清理那些在分配的资源块,以及运行,如果在发生异常时,需要即使执行任何代码的try块.通常,当控制离开try 语句时,执行finally块的语句,是否由于正常执行而发生控制转移,执行break,continue,gotoreturn 语句,还是传播异常在try语句之外.

在处理的异常中,保证运行关联的finally块.但是,如果未处理异常,则finally块的执行 取决于如何触发异常展开操作.反过来,这取决于您的计算机的设置方式.有关更多信息,请参阅CLR中的未处理异常处理.

注意:CLR中的未处理异常处理是对2008年9月MSDN杂志中的文章的引用.MSDN杂志的所有2008年及以前的版本仅作为.chm文件提供,并且需要在查看之前下载.


P.K*_*P.K 18

我认为可以回答的最好方法是使用代码,因此使用下面的图像 在此输入图像描述

  • + 1令人敬畏的画面...讲千言万语. (6认同)

dcp*_*dcp 5

因为在finally块中抛出了异常,所以它导致控制落到最后的finally块.所以"asdf"WriteLine永远不会执行.