Обернуть IEnumerable и перехватить исключения

У меня есть несколько классов, которые могут Process () объекты и возвращать свои собственные объекты:

public override IEnumerable Process(IEnumerable incoming) { ... }

Я хочу написать класс процессора, который может оборачивать один из этих процессоров и регистрировать любые неперехваченные исключения что может вызвать обернутый метод Process () . Моя первая идея была примерно такой:

public override IEnumerable Process(IEnumerable incoming) {
    try {
        foreach (var x in this.processor.Process(incoming)) {
            yield return x;
        }
    } catch (Exception e) {
        WriteToLog(e);
        throw;
    }
}

, но это не работает из-за CS1626: Невозможно получить значение в теле блока try с предложением catch .

Итак, я хочу написать что-то концептуально эквивалентное, но компилируемое. :-) У меня есть это:

public override IEnumerable Process(IEnumerable incoming) {
    IEnumerator 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;
    }
}

, но это сложнее, чем я ожидал, и я ' Я не совсем уверен в его правильности или в том, что нет более простого способа.

На правильном ли я здесь пути? Есть ли более простой способ?

11
задан Ken 30 September 2010 в 23:54
поделиться