これらは2つの異なるものです。
- catchブロックは、tryブロックで例外がスローされた場合にのみ実行されます。
- 例外がスローされたかどうかにかかわらず、finallyブロックは常にtry(-catch)ブロックの後に実行されます。
あなたの例では、3番目の可能な構成を示していません:
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
}
}
Throwable
からfinally
存在していない可能性があるため、ブロックすることThrowable
。