为什么最后块存在?

时间:2018-07-19 21:08:01

标签: try-catch-finally

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

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

但是我们可以执行相同的代码而不会像这样最终阻塞:

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

alwaysExecuted();

那么,为什么最终阻止存在?任何人都有一个示例,要求finally阻止?

谢谢

4 个答案:

答案 0 :(得分:1)

即使这些示例也不等效:如果sensitiveFunction()抛出了不会扩展Exception but Error instead的内容,那么alwaysExecuted将在没有{{1}的情况下执行}(请不要尝试通过捕获finally来“修复”此问题。)

或者说Throwable本身会引发异常:添加一些信息后,从executedWhenFailed()块中抛出异常是很普遍的。同样,catch将不会在第二个片段中执行。

或者假设您有alwaysExecuted()而不是一个电话。等等。

答案 1 :(得分:1)

finally的存在使代码始终可以运行,而不必考虑是否捕获到异常。

有时您只想同时使用tryfinally

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

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

答案 2 :(得分:0)

如果在catch块中抛出新的异常,则最终(在处理了该异常之后)最终将在finally块中结束。但是赶上后就没排队了。

只需在executedWhenFailed中引发异常,在第一个示例alwaysExecuted中将执行该异常,而在第二个示例中则不会。

答案 3 :(得分:0)

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

(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())