1. ホーム
  2. java

[解決済み] try-finallyとtry-catchの違いについて

2022-03-08 14:01:08

質問

とはどう違うのですか?

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

そして

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

私は2番目のバージョンの方が、Throwableにアクセスできるので好きです。この2つのバリエーションには、論理的な違いや好ましい規則があるのでしょうか?

また、finally節から例外にアクセスする方法はありますか?

どのように解決するのですか?

この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ブロックの中で値を代入することは可能です。もちろん、ブロックの外で例外を保持する変数を宣言し、catchブロックの中で値を代入することも可能だ。

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