Wickeln Sie ein IEnumerable und abfangen von Ausnahmen

Habe ich eine Reihe von Klassen, können Process() Objekte, und kehren Sie Ihre eigenen Objekte:

public override IEnumerable<T> Process(IEnumerable<T> incoming) { ... }

Ich schreiben möchte eine Prozessor-Klasse, wickeln kann man diese Prozessoren, und melden Sie eine nicht abgefangene Ausnahmen, die die umschlossene Process() Methode auslösen könnte. Meine erste Idee war etwas wie:

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;
    }
}

aber das funktioniert nicht, wegen CS1626: Nicht Ertrag einen Wert im Körper von einem try-block mit einem catch-Klausel.

So, ich möchte etwas schreiben, dass das begrifflich gleichwertig, aber kompiliert. 🙂 Ich habe diese:

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;
    }
}

aber das ist komplexer als ich gehofft hatte, und ich bin mir nicht ganz sicher, entweder die Richtigkeit oder, dass es nicht eine viel einfachere Möglichkeit.

Bin ich auf dem richtigen Weg? Gibt es einen einfacheren Weg?

InformationsquelleAutor Ken | 2010-09-30
Schreibe einen Kommentar