同じ処理ロジックが必要なため、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
。また、ハンドラ メソッドが例外を再スローする必要がある場合 (およびそれがチェックされている場合)、シグネチャで重大な問題が発生します。具体的には、 をhandleException
throwing として宣言する必要があります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
注意:SuperException
上記の の場合Exception
、(すべての) チェックされていない例外が発生するか、シグネチャ を持つ例外が再スローされることになりますException
。 どちらも問題になります。