多年来,我在许多语言中使用了 try-catch/except-finally 变体,今天有人问我 finally 的意义是什么,我无法回答。
基本上,为什么要在finally中放入一条语句,而不是仅仅将其放在整个try-catch block 之后?或者换句话说,以下代码块之间是否存在差异:
try{ //a}
catch {//b}
finally {//c}
try{//a}
catch{//b}
//c
编辑:
人们,我知道finally的作用,我已经使用它很多年了,但我的问题是在上面的示例中将//c
放在finally中似乎是多余的,不是吗?
请您参考如下方法:
finally
block 的目的是确保代码在三种情况下运行,而单独使用“catch” block 无法清楚地处理这些情况:
- 如果
try
block 中的代码通过fallthrough或return退出
- 如果
catch
block 中的代码重新抛出捕获的异常,或者(无意或有意)最终抛出一个新异常。 - 如果
try
block 中的代码遇到try
没有catch
的异常。
可以在每次 return
或 throw 之前复制 finally
代码,并将 catch
block 包装在自己的 try/catch 中,以允许发生意外异常的可能性,但放弃所有这些并简单地使用 finally
block 要容易得多。
顺便说一句,我希望语言设计者能够在 finally
block 中包含一个 exception
参数,以处理在执行完之后需要清理的情况。异常,但仍然希望它渗透到调用堆栈中(例如,可以将构造函数的代码包装在这样的构造中,如果构造函数要因异常退出,则Dispose
正在构造的对象) .