【问题标题】:Method wrapper for dealing with Exceptions?处理异常的方法包装?
【发布时间】:2016-07-25 14:27:08
【问题描述】:

我正在实现Iterator,为了处理Exceptions,我使用了以下模式:实际工作在私有hasNextPriv() 方法中完成,而hasNext() 方法处理Exceptions。这样做的原因是因为我不想用try-catch 块乱扔hasNextPriv()。

@Override
public boolean hasNext()
{
    try {
        return hasNextPriv();
    } catch (XMLStreamException e) {
        e.printStackTrace();
        try {
            reader.close();
        } catch (XMLStreamException e1) {
            e1.printStackTrace();
        }
    }
    return false;
}

问题:

  1. 有没有更好的方法来做到这一点?
  2. 私有方法hasNextPriv() 的好名字是什么?

【问题讨论】:

标签: java exception exception-handling iterator


【解决方案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,存在特定的数据结构域。或许您可以想出更具体的名称,例如 hasMoreNodes 或 notEmpty 等。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-09
    • 1970-01-01
    • 2023-04-10
    • 1970-01-01
    • 2014-04-02
    • 1970-01-01
    • 2012-12-27
    相关资源
    最近更新 更多