我正在实现一个迭代器
,为了处理异常
,我使用以下模式:实际工作是在私有(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;
}
问题:
- 有更好的方法吗?
- 私有(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
,在您的情况下,存在特定的数据结构域。也许您可以想出更具体的名称,例如 hasMoreNodes
或 notEmpty
等。
关于java - 处理异常的方法包装?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38570422/