为什么 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
存在,因此代码可以始终是 运行,而不管您是否捕获到异常。
有时您只想同时使用 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())
在大多数编程语言中,都有一个 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
存在,因此代码可以始终是 运行,而不管您是否捕获到异常。
有时您只想同时使用 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())