I've got a bunch of classes that can Process()
objects, and return their own objects:
public override IEnumerable<T> Process(IEnumerable<T> incoming) { ... }
I want to write a processor class that can wrap one of these processors, and log any uncaught exceptions that the wrapped Process()
method might throw. My first idea was something like this:
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;
}
}
but this doesn't work, due to CS1626: Cannot yield a value in the body of a try block with a catch clause.
So I want to write something that's conceptually equivalent but compiles. :-) I've got this:
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;
}
}
but that's more complex than I'd hoped, and I'm not entirely certain of either its correctness or that there isn't a much simpler way.
Am I on the right track here? Is there an easier way?
walker
variable is not properlyDispose
ed. You should alwaysDispose
IEnumerator
s since they may contain resources. – Ireland