处理异常的方法包装器?

时间:2016-07-25 14:27:09

标签: java exception exception-handling iterator

我正在实施Iterator并且为了处理Exceptions我正在使用以下模式:实际工作是在私有hasNextPriv()方法中完成的,而{ {1}}方法处理hasNext()。这样做的原因是因为我不想在Exceptions块中乱丢hasNextPriv()

try-catch

问题:

  1. 有更好的方法吗?
  2. 私有方法@Override public boolean hasNext() { try { return hasNextPriv(); } catch (XMLStreamException e) { e.printStackTrace(); try { reader.close(); } catch (XMLStreamException e1) { e1.printStackTrace(); } } return false; } 的好名称是什么?

1 个答案:

答案 0 :(得分:1)

处理异常的另一种方法是在一个小的纯函数中提取抛出异常的每个部分,以正确处理每个异常。然后构造组成这些函数的最终结果。

Optional<Resource> open() {
    try{
         //...
         return Optional.of(resource);
    } catch {
         //....
         return Optional.empty();
    }
}

Optional<Value> read(Resource resource) {
    try{
         //...
         return Optional.of(resource.value);
    } catch {
         //....
         return Optional.empty();
    }
}

boolean hasNext() {
     open().flatMap(this::read).isPresent();
}

无需在任何地方返回Optional。通常有一些虚拟值,如Null Object Pattern

另一种模式是在对象中包装函数执行,生成结果或错误值。在库javaslang中,它看起来像

return Try.of(this::hasNextPriv)
    .recover(x -> Match(x).of(
        Case(instanceOf(Exception_1.class), /*handle exception*/),
        Case(instanceOf(Exception_2.class), ...)))
    .getOrElse(false);

Try对象类似于java 8 Optional,但不是保持现值或缺失值Try包含成功或失败的值。

关于在您的案例中命名hasNextPriv,存在特定的数据结构域。您可能会想出更具体的名称,例如hasMoreNodesnotEmpty等。