在大多数编程语言中,可以在try或catch块之后放置一个finally块,如下所示:
try {
sensitiveFunction();
} catch (Exception e) {
executedWhenFailed();
} finally {
alwaysExecuted();
}
但是我们可以执行相同的代码而不会像这样最终阻塞:
try {
sensitiveFunction();
} catch (Exception e) {
executedWhenFailed();
}
alwaysExecuted();
那么,为什么最终阻止存在?任何人都有一个示例,要求finally阻止?
谢谢
答案 0 :(得分:1)
即使这些示例也不等效:如果sensitiveFunction()
抛出了不会扩展Exception
but Error
instead的内容,那么alwaysExecuted
将在没有{{1}的情况下执行}(请不要尝试通过捕获finally
来“修复”此问题。)
或者说Throwable
本身会引发异常:添加一些信息后,从executedWhenFailed()
块中抛出异常是很普遍的。同样,catch
将不会在第二个片段中执行。
或者假设您有alwaysExecuted()
而不是一个电话。等等。
答案 1 :(得分:1)
finally
的存在使代码始终可以运行,而不必考虑是否捕获到异常。
有时您只想同时使用try
和finally
:
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())