我一直试图从Evernote Java API
编写一些关于异常处理的逻辑。
我偶然发现了一个奇怪的情况。
有两个例外 - EDAMSystemException
和EDAMUserException
(documentation 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()
方法创建包装器类仍然强制我进行实例检查。
我是否遗漏了某些东西,或者是否真的没办法,我还是要做检查?