在大多数编程语言中,有一个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
的存在使代码始终可以运行,而不考虑是否捕获到异常。
有时您只想将try
和finally
一起使用:
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())