为什么在C#中要使用finally?

212
无论什么在最终块内部是执行的(几乎)总是,那么将代码封装其中或者让其保持未封闭的状态之间有什么区别呢?

3
“你说让它不要关闭,具体是什么意思?” - Ramesh
5
你所说的“(almost)”是什么意思? - Beska
1
这完全不是真的。整个重点在于,如果发生错误,控制流将跳转到catch块。它始终运行所有代码的唯一方法是如果从未发生异常,那么你为什么要使用try / catch呢? - Ed S.
52
如果在机器执行try代码块时拔掉电源线,那么finally代码块将不会被调用。 - Dour High Arch
3
@Ed:使用事务。你的try代码块必须进行某种临时或内存中的更改,以便在finally代码块中实现单个原子性的持久化更改。这通常不容易,并且可能需要特殊的硬件支持。 - Dour High Arch
显示剩余2条评论
13个回答

1

啊哈...我想我明白你的意思了!花了我一点时间...你在想"为什么要把它放在finally块中,而不是在finally块之后并完全在try-catch-finally之外"。

例如,这可能是因为如果您抛出错误,则会停止执行,但您仍然希望清理资源,例如打开的文件、数据库连接等。


1

finally块的控制流要么在try块之后,要么在catch块之后。

[1. First Code]
[2. Try]
[3. Catch]
[4. Finally]
[5. After Code]

有异常情况 1 > 2 > 3 > 4 > 5 如果3有一个返回语句 1 > 2 > 3 > 4

无异常情况 1 > 2 > 4 > 5 如果2有一个返回语句 1 > 2 > 4


0

正如文档中所述:

catch和finally一起的常见用法是在try块中获取和使用资源,在catch块中处理异常情况,并在finally块中释放资源。

还值得阅读这个,其指出:

一旦找到匹配的catch子句,系统便准备将控制转移到catch子句的第一条语句。在执行catch子句之前,系统首先按顺序执行与捕获异常的try语句嵌套程度更深的任何finally子句。

因此,显然位于finally子句中的代码即使先前的catch子句有一个return语句也将被执行。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接