我正在尝试编写一个异常处理程序类来处理流中的各种异常。业务流程会引发大量异常,并且处理程序具有将所有这些异常作为参数并进行所需处理的方法。我无法理解的行为是,当在业务流程中我只捕获异常(而不是特定的异常)然后将此捕获的异常实例传递给处理程序时,只调用了句柄(异常)而不是特定的处理程序用于特定异常的方法。以下代码片段将解释我的困惑。
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 的调用不会转到具有特定异常的特定方法。
另一件需要注意的事情是,如果我在第一个代码上添加一个演员,就像
try {
new Handler().handle(new BException());
throw new BException();
} catch (Exception e) {
new Handler().handle((BException)e);
}
输出符合预期(与第二个片段相同)
我确信这种行为是有意的,我只需要指向该记录行为的指针,还有我遇到的问题是,我的业务流程抛出了大约 30 个异常,并且由于这种行为,我必须编写 30 个单独的 catch 块。