处理使用相同方法抛出两个异常的API,但没有通用接口

时间:2016-07-19 11:14:33

标签: java api exception-handling api-design

我一直试图从Evernote Java API编写一些关于异常处理的逻辑。 我偶然发现了一个奇怪的情况。 有两个例外 - EDAMSystemExceptionEDAMUserExceptiondocumentation link

这两个异常都有一个方法EDAMErrorCode getErrorCode()但是它们缺少此方法的通用接口。

我觉得它只是API设计中的一个缺陷,因为他们声明其中一些代码仅对EDAMSystemException和其他EDAMUserExceptions

有意义

由于他们没有明确说明哪个EDAMErrorCode绑定到哪个异常,并且在某些异常类型中使用了某些代码的情况,我想要编写try-catch块:

try {
    clientFactory.createNoteStoreClient();
} catch (EDAMSystemException | EDAMUserException ex) {
    switch (ex.getErrorCode()) {
        case INVALID_AUTH:
        case BAD_DATA_FORMAT:
            ..
        case AUTH_EXPIRED:
            ...
        case RATE_LIMIT_REACHED:
            ...
        default:
            ...
    }
} catch (TException ex) {
   ...
}

但(显然)我不能打电话给ex.getErrorCode()。我可以进行实例检查(instanceof + cast),但看起来并不优雅。

我试图考虑这个问题的一些通用解决方案,但缺乏共同的祖先阻止我使用有界泛型。

使用两个构造函数和getMessage()方法创建包装器类仍然强制我进行实例检查。

我是否遗漏了某些东西,或者是否真的没办法,我还是要做检查?

0 个答案:

没有答案