“尝试最终”和“尝试捕获”之间的区别

2022-08-31 10:11:13

两者之间有什么区别

try {
    fooBar();
} finally {
    barFoo();
}

try {
  fooBar();
} catch(Throwable throwable) {
    barFoo(throwable); // Does something with throwable, logs it, or handles it.
}

我更喜欢第二个版本,因为它让我可以访问Shrewable。这两种变体之间是否存在任何逻辑差异或首选约定?

另外,有没有办法从 finally 子句访问异常?


答案 1

这是两回事:

  • 仅当 try 块中引发异常时,才会执行 catch 块。
  • 如果是否引发异常,则最终块始终在 try(-catch) 块之后执行。

在您的示例中,您没有显示第三种可能的构造:

try {
    // try to execute this statements...
}
catch( SpecificException e ) {
    // if a specific exception was thrown, handle it here
}
// ... more catches for specific exceptions can come here
catch( Exception e ) {
    // if a more general exception was thrown, handle it here
}
finally {
    // here you can clean things up afterwards
}

而且,就像@codeca在他的评论中所说的那样,没有办法访问最终块内的异常,因为即使没有异常,最终块也会被执行。

当然,您可以声明一个变量,该变量在块外部保存异常,并在 catch 块内分配一个值。之后,您可以在最终块内访问此变量。

Throwable throwable = null;
try {
    // do some stuff
}
catch( Throwable e ) {
    throwable = e;
}
finally {
    if( throwable != null ) {
        // handle it
    }
}

答案 2

这些不是变化,它们是根本不同的东西。 始终执行,仅当发生异常时才执行。finallycatch


推荐