首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在C#中嵌套try-finally

在C#中嵌套try-finally
EN

Stack Overflow用户
提问于 2012-06-15 02:56:33
回答 7查看 14.3K关注 0票数 24

为什么不执行行"Console.WriteLine("asdf");“?其他人都是。它不应该也是因为我们不能跳出最终的范围吗?

代码语言:javascript
复制
static bool Func()
{
    try
    {
        try
        {
        }
        finally
        {
            try
            {
                throw new ApplicationException();
            }
            finally
            {
                Console.WriteLine("asd");
            }

            Console.WriteLine("asdf");
        }
    }
    finally
    {
        Console.WriteLine("asd");
    }
}
EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2012-06-15 02:59:05

Finally块只保证(至少大部分保证,参见下面的MSDN摘录),在块抛出异常的情况下,它们将被输入。如果在finally块中抛出异常,则该异常将导致控件离开块,并且该finally块中的其余代码将不会执行。

在您的例子中,未被执行的行是在同一finally块中的异常之后发生的,因此它被跳过。

来自MSDN - try-finally

finally块对于清理在try块中分配的任何资源以及运行任何必须执行的代码非常有用,即使在try块中发生异常也是如此。通常,finally块的语句在控制离开try语句时执行,无论控制权的转移是作为正常执行、breakcontinuegoto E221或return语句的执行结果,还是异常传播出语句的结果。

在已处理的异常中,可以保证运行关联的finally块。但是,如果异常未处理,则finally块的执行取决于异常展开操作的触发方式。而这又取决于您的计算机的设置方式。有关更多信息,请参见CLR中的未处理异常处理。

注:引用了2008年9月号MSDN杂志上的一篇文章。MSDN Magazine的所有2008年和更早的期刊都只能以.chm文件的形式提供,并且需要在查看之前下载。

票数 30
EN

Stack Overflow用户

发布于 2012-06-15 03:15:05

我认为回答这个问题的最好方法是使用代码,因此如下图所示

票数 19
EN

Stack Overflow用户

发布于 2012-06-15 02:59:30

因为异常是在finally块中抛出的,所以它会导致控制掉到最后的finally块。因此,"asdf“WriteLine永远不会执行。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11039591

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档