2

SO上有很多关于“已检查与未检查异常”主题的帖子。这个答案可能是最全面和信息最丰富的。然而,我仍然对遵循那里提出的逻辑感到矛盾,这是有原因的。

我正在围绕一组彼此相似的服务构建一个包装 API。但是,它们之间存在细微差别(或将来可能出现这种差异),因此某些功能(次要和快捷性质)可能由某些服务支持而其他服务不支持。因此,采用以下方法似乎是合乎逻辑的:

public interface GenericWrapperInterface {
    void possiblyUnsupportedOperation () throws java.lang.UnsupportedOperationException;
}

为什么UnsupportedOperationException?因为它正是为这种情况而设计的。

但是,除了 Oracle自己的手册之外,所有相关的 SO 帖子都假定,如果使用异常来表示客户端可以从中恢复的问题,或者是可预测但不可避免的问题,那么该异常应该是经过检查的异常。我的案例符合这些要求,因为对于某些操作,可能会提前知道它们不可用的可能性,并且这些操作并不重要,如果需要可以避免。

所以我迷失在这个难题中。我应该使用完美匹配的标准异常并违反异常使用的常见逻辑,还是应该构建自己的检查替代方案,从而重复代码并在 API 用户之间造成额外的混乱?

4

2 回答 2

2

“UnsupportedOperationException”表示 Java OO 模型失败,特别是违反了 Liskov 原则。

通常,这意味着您的代码具有其他非 OO 方法来决定是否应调用相关方法:

if (instance.isSupportive()) instance.possiblyUnsupportedOperation();

因此,调用未实现的方法是一个逻辑错误,与断言失败、堆栈溢出或内存不足一样。因此,它不应该是一个检查异常。

于 2017-02-15T15:37:54.230 回答
0

经验法则是未经检查的异常代表程序员错误,而检查的异常代表情况。因此,作为 API 作者,您必须决定异常情况是否应该由程序员事先阻止,或者是否应该要求程序员在其发生后处理该情况。

于 2017-02-15T15:37:47.010 回答