如果从C#中的try或catch块返回,是否会执行finally块?如果是这样,在返回之前或之后?

时间:2010-09-15 06:32:02

标签: c# exception-handling

没有可用的内容!

4 个答案:

答案 0 :(得分:45)

是的,finally块被执行但是流离开try块 - 无论是到达结尾,返回还是抛出异常。

从C#4规范,第8.10节:

  

当控制试一试时,始终执行finally块的语句   声明。无论控制转移是否因正常而发生,都是如此   执行,执行break,continue,goto或return语句,或者作为a执行   将异常传播出try语句的结果。

(当然,第8.10节有更详细的内容。)

请注意,返回值是在执行finally块之前确定的,所以如果你这样做了:

int Test()
{
    int result = 4;
    try
    {
        return result;
    }
    finally
    {
        // Attempt to subvert the result
        result = 1;
    }
}

...仍将返回值4,而不是1 - finally块中的赋值将不起作用。

答案 1 :(得分:6)

将始终执行finally块,这将在从方法返回之前发生,因此您可以安全地编写如下代码:

try {
    return "foo";
} finally {
    // This will always be invoked
}

或者如果您正在使用可支配资源:

using (var foo = GetFoo())
{
    // foo is guaranteed to be disposed even if an exception is thrown
    return foo.Bar();
}

答案 2 :(得分:3)

对于.NET从Windows继承的两遍异常处理,你无法准确地说在执行控制权回传给调用者之前finally块执行了。

finally块将在更多嵌套调用帧中的finally块之后执行,并且在最终块之前执行,并且在较少嵌套的调用帧中执行catch块,这与返回之前运行的finally块一致。但是抛出点和捕获点之间的所有异常过滤器都将在任何finally块之前运行,这意味着在出现异常时,一些调用者代码可以在finally块之前运行。

当控件正常离开块时(没有抛出异常),则最终在控制权返回给调用者之前运行。

答案 3 :(得分:2)

如果从C-Sharp的try或catch块返回,会执行finally块吗?

如果愿意,在返回之前或之后?

BEFORE