如果方法抛出的异常与它所执行的任务没有明显的联系,这种情况将使人不知所措。当方法传递由低层抽象抛出异常时,往往会发生这种情况。除了使人感到困惑之外,这也“污染”了具有实现细节的更高层的API。如果高层的实现在后续的发行版本中发生了变化,它所抛出的异常也可能跟着发生变化,从而潜在地破坏现有的客户端程序。
为了避免这个问题,更高层的实现应该捕获低层的异常,同时抛出可以按照高层抽象进行解释的异常。这种做法称为异常转译(exception translation),如下代码所示:
// Exception Translation
try {
... // Use lower-level abstraction to do our bidding
} catch (LowerLevelException e) {
throw new HigherLevelException(...);
}