为什么区块最终存在



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

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

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

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

那么,为什么最后块存在呢?有人举过一个需要最后阻止的例子吗?

感谢

即使是这些例子也不等价:如果sensitiveFunction()抛出的不是扩展Exception而是扩展Error的东西,那么没有finally就不会执行alwaysExecuted(请不要试图通过捕获Throwable来"修复"这一问题(。

或者说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())

相关内容

  • 没有找到相关文章

最新更新