这是两个不同的东西:
- 只有在 try 块中抛出异常时才会执行 catch 块。
- finally 块总是在 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 在他的评论中所说,没有办法访问 finally 块内的异常,因为即使没有异常,也会执行 finally 块。
当然,你可以在你的块外声明一个保存异常的变量,并在 catch 块内分配一个值。之后,您可以在 finally 块中访问此变量。
Throwable throwable = null;
try {
// do some stuff
}
catch( Throwable e ) {
throwable = e;
}
finally {
if( throwable != null ) {
// handle it
}
}