Есть ли способ обработки - и продолжение - исключение в итераторе при сохранении синтаксического сахара foreach?
Нет такого сахара.
Иногда линии будут синтаксически фиктивными, но это не обязательно означает, что мы не должны продолжать читать файл.
Ну, если это не так, что линии являются фиктивными, зачем бросать исключения? Вы можете немного переделать свой итератор. Предполагая, что вы в настоящее время перебрать ParsedThingy
экземпляров, и что анализатор бросает ThingyParseException
если синтаксические не удается, перебрать обертки, которые позволяют запросить результаты синтаксического анализа для bogusness, как это:
for (Possibly<ParsedThingy, ThingyParseException> p : parser) {
if (p.exception() != null) handleException(p.exception());
else doSomethingExcitingWith(p.value());
}
Несколько более самодокументированна, чем, казалось бы, спонтанно возвращается null
s; он также позволяет вам сообщать информацию об ошибке клиенту.
Possibly<V, X>
- обертка вокруг значения, которое может быть фактически исключением. Вы можете запросить исключительный статус, проверяя, если exception()
не равен нулю, и получить значение для неисключительного случае по телефону value()
(который будет бросать, если это исключение):
class Possibly<V, X extends Throwable> {
private final V value;
private final X exception;
public static <V, X extends Throwable> Possibly<V, X> forValue(V v){
return new Possibly<V, X>(v, null);
}
public static <V, X extends Throwable> Possibly<V, X> forException(X x){
if (x == null) throw new NullPointerException();
return new Possibly<V, X>(null, x);
}
private Possibly(V v, X x){ value = v; exception = x; }
public X exception(){ return exception; }
public V value() throws X {
if (exception != null) throw exception;
return value;
}
}
Тогда ваш iterator()
будет выглядеть примерно так:
Iterator<Possibly<ParsedThingy, ThingyParseException>> parse() {
return new Iterator<Possibly<ParsedThingy, ThingyParseException>> {
public boolean hasNext(){ ... }
public void remove(){ ... }
public Possibly<ParsedThingy, ThingyParseException> next()
try {
ParsedThingy t = parseNext(); // throws ThingyParseException
return Possibly.forValue(t);
} catch (ThingyParseException e) {
return Possibly.forException(e);
}
}
};
}
Вид многословного, которого можно было бы избежать, сделав материал менее общим.
Покажите проблему с этим подходом (вам нужно иметь дело с нулями в теле цикла), и вы получите +1 голос. –
есть несколько проблем с этим подходом, но я сразу остановлюсь. –