java - 处理异常的方法包装?

标签 java exception iterator

我正在实现一个迭代器,为了处理异常,我使用以下模式:实际工作是在私有(private)中完成的hasNextPriv() 方法,而 hasNext() 方法处理异常。这样做的原因是因为我不想用 try-catch block 乱扔 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. 私有(private)方法 hasNextPriv() 的好名字是什么?

最佳答案

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

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 等。

关于java - 处理异常的方法包装?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38570422/

相关文章:

vb.net - 使用 BouncyCaSTLe 的 key 对于在指定状态 CryptographicException 中使用无效

c++ - 列表迭代器不可取消引用

c++ - ofstream异常处理

rust - 是使用 drain(..) 来保留原始结构的内存分配的唯一原因吗?

iterator - 如何对 ReadDir 迭代器进行排序

java - 对下拉列表进行排序

java - 如何查看 Eclipse 内置插件的特定版本

java - 分离的对象如何在 hibernate 中工作

java - 引用非最终变量 : why does this code compile?

python - 内存错误消息,因为字符串在 Python 中为空