为什么 finally 块存在?

Why finally block exists?

在大多数编程语言中,都有一个 finally 块可以放在 try 或 catch 块之后,如下所示:

try {
    sensitiveFunction();
} catch (Exception e) {
    executedWhenFailed();
} finally {
    alwaysExecuted();
}

但是我们可以执行相同的代码而无需像这样的 finally 块:

try {
    sensitiveFunction();
} catch (Exception e) {
    executedWhenFailed();
}

alwaysExecuted();

那么,为什么finally块会存在呢?谁有需要 finally block 的例子?

谢谢

即使这些例子也不等价:如果 sensitiveFunction() 抛出一些不扩展 Exception but Error instead 的东西,alwaysExecuted 将不会在没有 [= 的情况下执行14=](请不要尝试通过捕获 Throwable 来 "fix")。

或者说 executedWhenFailed() 本身抛出异常:在添加一些信息后从 catch 块中重新抛出异常是很常见的。同样,alwaysExecuted() 不会在第二个代码段中执行。

或者假设您有 return sensitiveFunction(); 而不仅仅是一个电话。等等等等

finally 存在,因此代码可以始终是 运行,而不管您是否捕获到异常。

有时您只想同时使用 tryfinally:

allocate()
try: 
   do_something_with_allocated()
finally:
   deallocate()

在上面的示例中,它让您 100% 自信地清理上面打开的资源,而不考虑可能传播的任何异常。

如果您在 catch 块中抛出一个新的异常,您最终(在处理该异常之后)将在您的 finally 块中结束。但在你接球后不在队伍中。

只需在 executedWhenFailed 中抛出异常,在您的第一个示例中 alwaysExecuted 将被执行,在第二个示例中则不会。

即使catch()块中有return语句,也会执行finally块。

(JavaScript 中的示例)

function foo() {
  try {
    throw "first"
  } catch(err){
    console.log(err)
    return "third"
  } finally {
    console.log("second") // Called before return in catch block
  }
  return "Never reached"
}

console.log(foo())