Обработка исключений генератора в его потребителе

Это продолжение -до Обработка исключения в генераторе и обсуждение более общей проблемы.

У меня есть функция, которая читает данные в разных форматах. Все форматы ориентированы на строку -или запись -, и для каждого формата существует специальная функция разбора, реализованная в виде генератора. Таким образом, основная функция чтения получает ввод и генератор, который считывает соответствующий формат из ввода и возвращает записи основной функции :

def read(stream, parsefunc):
    for record in parsefunc(stream):
        do_stuff(record)

. где parsefuncчто-то вроде:

def parsefunc(stream):
    while not eof(stream):
        rec = read_record(stream)
        do some stuff
        yield rec

Проблема, с которой я столкнулся, заключается в том, что в то время как parsefuncможет вызвать исключение (, например. при чтении из потока )он понятия не имеет, как с этим обращаться. За обработку исключений отвечает основная функция read.Обратите внимание, что исключения возникают для каждой -записи, поэтому даже если одна запись дает сбой, генератор должен продолжать свою работу и возвращать записи до тех пор, пока не будет исчерпан весь поток.

В предыдущем вопросе я пытался поместить next(parsefunc)в блок try, но, как оказалось, это не сработает. Поэтому я должен добавить try-exceptк самому parsefunc, а затем каким-то образом доставить исключения потребителю :

def parsefunc(stream):
    while not eof(stream):
        try:
            rec = read_record()
            yield rec
        except Exception as e:
            ?????

. Я довольно неохотно делаю это, потому что

  • нет смысла использовать tryв функции, которая не предназначена для обработки каких-либо исключений
  • мне непонятно, как передавать исключения в потребляющую функцию
  • будет много форматов и много parsefunc, я не хочу загромождать их слишком большим количеством вспомогательного кода.

Кто-нибудь предлагает лучшую архитектуру?

Примечание для гуглеров :В дополнение к основному ответу обратите внимание на senderle и Jon -, очень умные и проницательные материалы.

28
задан Community 23 May 2017 в 12:32
поделиться