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