Skip to main content
 首页 » 编程设计

exception之try catch/except finally 语句中的finally有什么意义

2024年02月27日23think

多年来,我在许多语言中使用了 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 无法清楚地处理这些情况:

  1. 如果try block 中的代码通过fallthrough或return退出
  2. 如果catch block 中的代码重新抛出捕获的异常,或者(无意或有意)最终抛出一个新异常。
  3. 如果 try block 中的代码遇到 try 没有 catch 的异常。

可以在每次 return 或 throw 之前复制 finally 代码,并将 catch block 包装在自己的 try/catch 中,以允许发生意外异常的可能性,但放弃所有这些并简单地使用 finally block 要容易得多。

顺便说一句,我希望语言设计者能够在 finally block 中包含一个 exception 参数,以处理在执行完之后需要清理的情况。异常,但仍然希望它渗透到调用堆栈中(例如,可以将构造函数的代码包装在这样的构造中,如果构造函数要因异常退出,则Dispose正在构造的对象) .