如何使用异常instanceof改进难看的catch块

时间:2014-05-29 19:44:29

标签: java exception instanceof inherited

请注意:来电者只会抛出parentexception !!

假设aexceptionbexception继承自parentexception

在方法af中,throws aexceptionbexceptionparentexception

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

方法caller仅调用afthrow parentexception

void caller() throws parentexception

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

方法rootCaller调用方法callerrootcaller只能catch parentexception caller抛出void rootCaller() { try { caller(); } catch(parentexception e) { if(e instanceof aexception) { ...... } else if(e instanceof bexception) { ...... } else if(e instanceof parentexception) { ...... } else { ...... } } 并使用以下异常进程catch块:

{{1}}

如果子类太多,这是非常丑陋并且很容易忘记一些parentexception的子类。

无论如何都要改进这样的代码吗?

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

1,rootCaller不能使用multi-catch来简化进程,导致调用者只抛出parentexception。

2,因为调用者只抛出parentexception,所以没有任何其他异常检查是否af被改为后者抛出超过aexception和bexception,比如说cexception。

1 个答案:

答案 0 :(得分:7)

正如其他人在评论中所建议的那样,你应该使用多个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)块,因为已达到catch (ParentException e)并首先执行