我正在实施Iterator
并且为了处理Exceptions
我正在使用以下模式:实际工作是在私有hasNextPriv()
方法中完成的,而{ {1}}方法处理hasNext()
。这样做的原因是因为我不想在Exceptions
块中乱丢hasNextPriv()
。
try-catch
问题:
@Override
public boolean hasNext()
{
try {
return hasNextPriv();
} catch (XMLStreamException e) {
e.printStackTrace();
try {
reader.close();
} catch (XMLStreamException e1) {
e1.printStackTrace();
}
}
return false;
}
的好名称是什么?答案 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
,存在特定的数据结构域。您可能会想出更具体的名称,例如hasMoreNodes
或notEmpty
等。