J'ai un tas de classes qui peuvent Process()
objets et retourner leurs propres objets:enveloppe un IEnumerable et capture des exceptions
public override IEnumerable<T> Process(IEnumerable<T> incoming) { ... }
Je veux écrire une classe de processeur qui peut envelopper un de ces processeurs, et consignez toutes les exceptions non interceptées que la méthode Process()
enveloppée peut lancer. Ma première idée était quelque chose comme ceci:
public override IEnumerable<T> Process(IEnumerable<T> incoming) {
try {
foreach (var x in this.processor.Process(incoming)) {
yield return x;
}
} catch (Exception e) {
WriteToLog(e);
throw;
}
}
mais cela ne fonctionne pas, en raison de CS1626: Cannot yield a value in the body of a try block with a catch clause. Donc je veux écrire quelque chose qui est conceptuellement équivalent mais compile. :-) J'ai ceci:
public override IEnumerable<T> Process(IEnumerable<T> incoming) {
IEnumerator<T> walker;
try {
walker = this.processor.Process(incoming).GetEnumerator();
} catch (Exception e) {
WriteToLog(e);
throw;
}
while (true) {
T value;
try {
if (!walker.MoveNext()) {
break;
}
value = walker.Current;
} catch (Exception e) {
WriteToLog(e);
throw;
}
yield return value;
}
}
mais c'est plus complexe que je ne l'avais espéré, et je ne suis pas tout à fait certain soit son exactitude ou qu'il n'y a pas une façon beaucoup plus simple.
Suis-je sur la bonne voie ici? Y a-t-il un moyen plus facile?
Qu'en est-il de l'implémentation directe de IEnumerable et de la détection d'exceptions dans votre MoveNext et Current? –
@Matt, je pense que c'est la bonne réponse. Vous devriez l'avoir fait tel. Rien de mal à court et doux. :) –
Pourquoi ne pas simplement enlever la boucle foreach et céder? –