为什么不是“Console.WriteLine(”asdf“);”执行?所有其他人都是。难道不是因为我们不能从最终范围跳出来吗?
static bool Func()
{
try
{
try
{
}
finally
{
try
{
throw new ApplicationException();
}
finally
{
Console.WriteLine("asd");
}
Console.WriteLine("asdf");
}
}
finally
{
Console.WriteLine("asd");
}
}
答案 0 :(得分:26)
最后,阻止只保证(至少主要是保证,除了下面的MSDN之外),如果try块抛出异常,它们将 输入 。如果在finally块中抛出异常 ,异常将导致控制离开finally块,并且该finally块中的其余代码将不会执行。
在您的情况下,未执行的行发生在同一个finally块中的异常之后,因此会跳过它。
finally 块对于清理所有资源非常有用 在尝试块中分配,并运行任何必须执行的代码 即使尝试块中发生异常。通常, 当控件离开尝试时,会执行 finally 块的语句 声明,是否由于转移控制而发生 正常执行,执行中断,继续,转到或返回 语句,或从 try 语句中传播异常。
在处理的异常中,保证关联的 finally 块 要运行。但是,如果异常未处理,则执行 finally 块取决于异常展开操作的方式 触发。反过来,这取决于您的计算机的设置方式。 有关更多信息,请参阅CLR中的未处理异常处理。
注意:Unhandled Exception Processing in the CLR是对MSDN杂志2008年9月刊中一篇文章的引用。 MSDN杂志的所有2008年及以前的版本仅作为.chm文件提供,在查看之前需要下载。
答案 1 :(得分:18)
我认为可以回答的最好方法是使用代码,因此使用下面的图像
答案 2 :(得分:5)
因为在finally块中抛出了异常,所以它导致控制落到最后的finally块。所以“asdf”WriteLine永远不会执行。
答案 3 :(得分:4)
在finally(或catch)块中抛出的异常会取消该finally(或catch)块的剩余部分。
答案 4 :(得分:3)
错误发生在第3个try块内,导致其最终执行。但是,这会导致它最终出错,并被原始的try-finally块捕获。
答案 5 :(得分:1)
因为你已经抛出了try块,它将使用Console.WriteLine("asd");
执行finally块并退出到外部的try catch
答案 6 :(得分:0)
当我在不同主机平台上部署的代码上使用try-finally块时,我发现: 当try块上没有抛出异常时。
某些Windows平台总是执行finally块和 有些平台从未执行过finally块。
我的finally块包含关闭错误日志的指令,并且执行finally块的失败总是在退出时引发另一个异常,只留下可用的cryptric信息来找出导致错误的原因。 对于我的应用程序,尝试最后块比它们值得更麻烦。