没有可用的内容!
答案 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