为什么不执行行"Console.WriteLine("asdf");“?其他人都是。它不应该也是因为我们不能跳出最终的范围吗?
static bool Func()
{
try
{
try
{
}
finally
{
try
{
throw new ApplicationException();
}
finally
{
Console.WriteLine("asd");
}
Console.WriteLine("asdf");
}
}
finally
{
Console.WriteLine("asd");
}
}发布于 2012-06-15 02:59:05
Finally块只保证(至少大部分保证,参见下面的MSDN摘录),在块抛出异常的情况下,它们将被输入。如果在finally块中抛出异常,则该异常将导致控件离开块,并且该finally块中的其余代码将不会执行。
在您的例子中,未被执行的行是在同一finally块中的异常之后发生的,因此它被跳过。
来自MSDN - try-finally
finally块对于清理在try块中分配的任何资源以及运行任何必须执行的代码非常有用,即使在try块中发生异常也是如此。通常,finally块的语句在控制离开try语句时执行,无论控制权的转移是作为正常执行、break、continue、goto E221或return语句的执行结果,还是异常传播出语句的结果。
在已处理的异常中,可以保证运行关联的finally块。但是,如果异常未处理,则finally块的执行取决于异常展开操作的触发方式。而这又取决于您的计算机的设置方式。有关更多信息,请参见CLR中的未处理异常处理。
注:引用了2008年9月号MSDN杂志上的一篇文章。MSDN Magazine的所有2008年和更早的期刊都只能以.chm文件的形式提供,并且需要在查看之前下载。
发布于 2012-06-15 03:15:05
我认为回答这个问题的最好方法是使用代码,因此如下图所示

发布于 2012-06-15 02:59:30
因为异常是在finally块中抛出的,所以它会导致控制掉到最后的finally块。因此,"asdf“WriteLine永远不会执行。
https://stackoverflow.com/questions/11039591
复制相似问题