1. ホーム
  2. java

[解決済み] Javaで2つの例外を同じcatch blockでキャッチすることは可能ですか?重複

2022-05-15 10:09:02

質問

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

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

各キャッチブロックにハンドラのコードを重複させないようにすることは可能でしょうか?

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

Java 7 以降

多重例外の捕捉 は、Java 7 からサポートされています。

という構文になります。

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

の静的型は ex は、列挙した例外の中で最も特化した共通のスーパータイプです。 を再スローした場合、その例外が発生するという素晴らしい機能があります。 ex を再投入すると、コンパイラは列挙された例外のうち1つしか投げることができないことを認識します。


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 . また、ハンドラメソッドが例外を再スローする必要がある(そしてそれがチェックされる)場合、シグネチャで深刻な問題に遭遇することになります。 具体的には handleException を投げるように宣言しなければなりません。 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 の部分(例えば、他に SuperException の部分には他のサブタイプがないため) コードはより壊れやすくなります。 例外の階層が再編成された場合、このハンドラで else を持たないこのハンドラは、黙って例外を食らってしまうかもしれません!