在C#中嵌套try-finally

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

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

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

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

从MSDN – try-finally :

finally块对于清理try块中分配的任何资源以及运行任何必须执行的代码(即使try块中发生exception)也很有用。 通常,当控制离开try语句时,执行finally块的语句,是否由于正常执行而发生控制转移,执行breakcontinuegotoreturn语句,还是传播exception超出了try语句。

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

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

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

因为exception被抛出最后一个块,所以它导致控制落到最后的finally块。 所以“asdf”WriteLine永远不会执行。

在finally(或catch)块中抛出的exception会取消最终(或catch)块的剩余部分。

错误发生在第3个try块内部,导致其最终执行。 但是,这会导致它最终出错,并被原始的try-finally块捕获。

因为你已经抛出了try块,它将使用Console.WriteLine("asd");执行finally块Console.WriteLine("asd"); 并退出到外部尝试捕获

当我在不同主机平台上部署的代码上使用try-finally块时,我发现:当try块上没有抛出任何exception时。

一些Windows平台总是执行finally块,一些平台从未执行finally块。

我的finally块包含关闭错误日志的指令,并且执行finally块的失败总是在退出时引发另一个exception,只留下加密的innformation以找出导致错误的原因。 对于我的应用程序,尝试最后块比它们值得更麻烦。