java - 如何使用异常 instanceof 改进丑陋的 catch block

标签 java exception instanceof inherited

请注意:调用者只会抛出 parentexception!!

假设aexceptionbexception继承自parentexception

在方法af中,它throw aexceptionbexceptionparentexception

void af() throws aexception, bexception, parentexception {}

方法 caller 调用 af 并且仅throw parentexception

void caller() throws parentexception

这里丢失了parentexception子类的信息。

方法rootCaller调用方法callerrootcaller只能catch parentexceptioncaller抛出 并使用以下异常处理捕获 block :

void rootCaller() {
    try {
        caller(); 
    } catch(parentexception e) {
    if(e instanceof aexception) {
        ......
    } else   if(e instanceof bexception) {
        ......
    } else   if(e instanceof parentexception) {
        ......
    } else {
    ......
    }
}

如果子类太多,这太丑陋了,很容易忘记 parentexception 的一些子类。

有没有办法改进这样的代码?

目前的答案不能给我任何想法:

1、rootCaller不能使用multi-catch来简化流程,因为调用者只会抛出parentexception。

2、因为caller只抛出parentexception,如果af后面改成throws more than aexception和bexception,则没有任何其他异常检查,就说cexception。

最佳答案

正如其他人在评论中所建议的那样,您应该使用多个 catch 子句。

void rootCaller() {
    try {
        caller();
    } catch (AException e) {
        // ...
    } catch (ParentException e) {
        // ...
    } catch (BException e) {
        // ...
    } catch (AnotherException e) {
        // ...
    } catch (Exception e) {
        // ...
    }
}

捕获的顺序也很重要。异常将依次针对每个案例进行测试,并且只会触发第一个匹配的案例。

例如,在我上面的代码中,AExceptionBException 扩展了 ParentException catch (BException e)永远无法到达 block ,因为首先到达并执行了 catch (ParentException e)

关于java - 如何使用异常 instanceof 改进丑陋的 catch block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23941683/

相关文章:

java - Android App : Log-in to website, 维护 session - Java

java - Java 中的 printStackTrace() 方法有什么用?

奇怪行为的 JavaScript 实例

php - 为什么死于 connect_error() 不起作用?

c# - 线程时出现异常 - 线程之间的传播?

javascript - 在事件触发器上借助函数(动态)创建对象的实例

java - 尝试通过不同的类查看对象的实例数据

java - 获取 Android View 对象的当前 onClickListener

java - String.matches() 的 DOTALL

java - jgroup 是否使用校验和来使 UDP 变得可靠?