这是两回事:
- 仅当 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
}
}