フロー内のさまざまな例外を処理する例外ハンドラークラスを作成しようとしています。ビジネスフローは多くの例外をスローし、ハンドラーにはこれらすべての例外を引数として受け取り、必要な処理を行うメソッドがあります。私が理解できない動作は、ビジネスフローで(特定の例外ではなく)例外のみをキャッチし、このキャッチされた例外インスタンスをハンドラーに渡すと、handle(Exception)のみが呼び出され、特定のハンドラーは呼び出されないことです。特定の例外を対象としたメソッド。次のコードスニペットは私の混乱を説明します。
public class Scrap {
public static void main(String[] args) {
try {
new Handler().handle(new BException());
throw new BException();
} catch (Exception e) {
new Handler().handle(e);
}
}
static class Handler {
public void handle(AException e) {
System.out.println(e.getClass());
System.out.println("AAE");
}
public void handle(BException e) {
System.out.println(e.getClass());
System.out.println("BBE");
}
public void handle(Exception e) {
System.out.println(e.getClass());
System.out.println("E");
}
}
static class AException extends Exception {
private static final long serialVersionUID = 1L;
}
static class BException extends Exception {
private static final long serialVersionUID = 1L;
}
}
出力は次のとおりです。
class Scrap$BException
BBE
class Scrap$BException
E
別のcatchブロックを次のように追加した場合:
try {
new Handler().handle(new BException());
throw new BException();
} catch (BException e) {
new Handler().handle(e);
} catch (Exception e) {
new Handler().handle(e);
}
その場合、出力は次のようになります。
class Scrap$BException
BBE
class Scrap$BException
BBE
最初のケースでは、特定の例外を除いて、Handler.handleの呼び出しが特定のメソッドに送信されないのはなぜですか。
注意すべきもう1つのことは、最初のコードにキャストを追加すると、
try {
new Handler().handle(new BException());
throw new BException();
} catch (Exception e) {
new Handler().handle((BException)e);
}
出力は期待どおりです(2番目のスニペットと同じ)
この動作は意図されたものであると確信しています。文書化された動作へのポインタが必要です。また、私が抱えている問題は、ビジネスフローが最大30の例外をスローし、この動作のために30の個別のcatchブロックを作成する必要があることです。