Est-il possible de manutention - et suite d'une exception dans un itérateur tout en maintenant le sucre syntaxique foreach?
Il n'y a pas de tel sucre. Parfois, les lignes seront syntaxiquement fausses, mais cela ne signifie pas nécessairement que nous ne devrions pas continuer à lire le fichier. Eh bien, si ce n'est pas si exceptionnel que les lignes sont fausses, pourquoi jeter des exceptions? Vous pourriez retravailler un peu votre itérateur. En supposant que vous parcourons actuellement plus ParsedThingy
cas, et que l'analyseur lancers ThingyParseException
si l'analyse syntaxique échoue, itérer sur des emballages qui permettent de vous interrogez les résultats parse pour bogusness, comme celui-ci:
for (Possibly<ParsedThingy, ThingyParseException> p : parser) {
if (p.exception() != null) handleException(p.exception());
else doSomethingExcitingWith(p.value());
}
Un peu plus autodocumenté que semble revenir spontanément null
s; Il vous permet également de donner des informations sur l'erreur au code client.
Possibly<V, X>
est une enveloppe autour d'une valeur qui peut en fait être une exception. Vous pouvez interroger pour un statut exceptionnel en vérifiant si exception()
est non nul, et obtenir la valeur pour le cas non exceptionnel en appelant value()
(qui jetteront si elle est une exception):
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;
}
}
Ensuite, votre iterator()
ressemblera à quelque chose comme ceci:
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);
}
}
};
}
Type de verbeux, pourrait être évité en rendant les choses moins génériques.
Montrez le problème avec cette approche (vous devez faire face à des valeurs nulles dans le corps de la boucle) et vous obtenez un vote +1. –
il y a plus d'un problème avec cette approche, mais je vais élaborer tout de suite. –