Java では、同じ catch ブロックで 2 つの例外をキャッチすることは可能ですか? [重複] 質問する

Java では、同じ catch ブロックで 2 つの例外をキャッチすることは可能ですか? [重複] 質問する

同じ処理ロジックが必要なため、2 つの例外をキャッチする必要があります。次のようなことをしたいと思います。

catch (Exception e, ExtendsRuntimeException re) {
    // common logic to handle both exceptions
}

各 catch ブロック内のハンドラー コードの重複を避けることは可能ですか?

ベストアンサー1

Java 7以降

複数の例外のキャッチJava 7 以降ではサポートされています。

構文は次のとおりです。

try {
     // stuff
} catch (Exception1 | Exception2 ex) {
     // Handle both exceptions
}

の静的型は、リストされている例外の中で最も特殊化された共通のスーパータイプです。catchで再スローすると、コンパイラは例外の1つだけが例外であると認識するというex便利な機能があります。exリストされている例外がスローされる可能性があります。


Java 6以前

Java 7 より前では、これを処理する方法はありますが、洗練されておらず、制限があります。

アプローチ 1

try {
     // stuff
} catch (Exception1 ex) {
     handleException(ex);
} catch (Exception2 ex) {
     handleException(ex);
}

public void handleException(SuperException ex) {
     // handle exception here
}

例外ハンドラが の前に宣言されたローカル変数にアクセスする必要がある場合、これは面倒になりますtry。また、ハンドラ メソッドが例外を再スローする必要がある場合 (およびそれがチェックされている場合)、シグネチャで重大な問題が発生します。具体的には、 をhandleExceptionthrowing として宣言する必要がありますSuperException... これは、囲んでいるメソッドのシグネチャを変更しなければならない可能性があることを意味します。

アプローチ 2

try {
     // stuff
} catch (SuperException ex) {
     if (ex instanceof Exception1 || ex instanceof Exception2) {
         // handle exception
     } else {
         throw ex;
     }
}

ここでも、署名に関する潜在的な問題があります。

アプローチ3

try {
     // stuff
} catch (SuperException ex) {
     if (ex instanceof Exception1 || ex instanceof Exception2) {
         // handle exception
     }
}

部分を省略すると(たとえば、現時点でelseの他のサブタイプが存在しないなど)、コードはより脆弱になります。例外階層が再編成されると、 のないこのハンドラーは、例外を黙って消費してしまう可能性があります。SuperExceptionelse


注意:SuperException上記の の場合Exception、(すべての) チェックされていない例外が発生するか、シグネチャ を持つ例外が再スローされることになりますException。 どちらも問題になります。

おすすめ記事