如果您运行下面的代码,它实际上会在每次调用 goto 之后执行 finally:
int i = 0;
Found:
i++;
try
{
throw new Exception();
}
catch (Exception)
{
goto Found;
}
finally
{
Console.Write("{0}\t", i);
}
为什么?
如果您运行下面的代码,它实际上会在每次调用 goto 之后执行 finally:
int i = 0;
Found:
i++;
try
{
throw new Exception();
}
catch (Exception)
{
goto Found;
}
finally
{
Console.Write("{0}\t", i);
}
为什么?
以下文字来自C#语言规范(8.9.3的goto语句)
goto 语句执行如下:
为什么你期望它不执行?
如果你有 try/catch/finally 或 try/finally 块,不管你在 try 或 catch 块中大部分时间有什么代码 ,finally 块都会执行。
考虑“返回”,而不是 goto。
//imagine this try/catch/finally block is inside a function with return type of bool.
try
{
throw new Exception();
}
catch (Exception)
{
return false; //Let's say you put a return here, finally block still executes.
}
finally
{
Console.WriteLine("I am in finally!");
}
给出的答案的要点 - 当控制通过任何方式离开受保护区域时,无论是“return”,“goto”,“break”,“continue”还是“throw”,“finally”都会被执行 - 是正确的。但是,我注意到几乎每个答案都说“finally 块总是运行”。 finally 块并不总是运行。在很多情况下,finally 块都不会运行。
谁想尝试将它们全部列出?
似乎有道理。finally
块总是在或try
之后运行catch
。
相似地
try
{
// do something
return;
}
finally
{
// do something else
}
将始终运行该finally
块。编辑 - 但请参阅上面 Eric 的评论。
这是设计使然。在异常处理程序中,您可以采取一些特定于异常的操作。在 finally 块中,您应该进行资源清理——这就是为什么无论异常处理代码是什么,都始终执行 finally 块的原因。
正如人们所提到finally
的,无论程序流程如何,都会运行。当然,finally
block 是可选的,所以如果你不需要它,就不要使用它。
因为一条finally
语句预计在离开后try
(或catch
捕获异常时)执行。这包括您拨打 goto 电话的时间。
这就是finally
区块的重点。它总是执行(几乎)。