如何避免使用instanceof

B1ExceptionB2Exception都继承BException,它们在一个方法中作为BException被catch,又变换为AException被throw出去。

catch(BException e){
    throw AException(e)
}

最终catch到AException的地方,想根据到底是哪种BException来分开处理。
如果不用instanceof,应该怎么修改?

catch (AException e) {
    if (e.getCause() instanceof B1Exception){
        throw new BadRequestException(ErrorCode.B1, e);
    } else if (e.getCause() instanceof B2Exception){
        throw new ServerErrorException(e);
    }
}

谢谢各位指教。

阅读 2.1k
3 个回答

没写过 Java ,不过这种情况不能写多个 catch 吗?

try {
    // ...
} catch (B1Exception e) {
    throw new BadRequestException(ErrorCode.B1, e);
} catch (B2Exception e) {
    throw new ServerErrorException(e);
}

没啥办法,因为 AException 的 cause 不一定是啥,这里的 instaceof 的判断也就去不掉
如果有必要就直接去掉 AException 这层,直接抓 B1和B2Exception

抛出的语句有问题.
如果最终B1Exception 和 B2Exception 需要被区别处理, 那么在抛出时就需要分别抛出, 处理时分别catch
如果需要将BException 转化成 AException, 可以创建 A1Exception, A2Exception 继承AException
抛出:

catch(B1Exception e){
    throw A1Exception(e)
} catch(B2Exception e){
    throw A2Exception(e)
}

捕获:

try {
    // ...
} catch (A1Exception e) {
    throw new BadRequestException(ErrorCode.B1, e);
} catch (A2Exception e) {
    throw new ServerErrorException(e);
}
推荐问题