这是处理生成器中抛出的异常的后续内容,并讨论了一个更普遍的问题。
我有一个读取不同格式数据的函数。所有格式都是面向行或面向记录的,并且对于每种格式都有一个专用的解析功能,作为生成器实现。所以主读取函数得到一个输入和一个生成器,它从输入中读取其各自的格式并将记录传递回主函数:
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
可以抛出异常(例如从流中读取时),但它不知道如何处理它。负责处理异常的函数是mainread
函数。请注意,异常发生在每条记录的基础上,因此即使一条记录失败,生成器也应继续其工作并返回记录,直到整个流耗尽。
在上一个问题中,我尝试放入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
's,我不想用太多的帮助代码弄乱它们。
有没有人建议更好的架构?