这是处理生成器中抛出异常的后续操作,并讨论了一个更普遍的问题.
我有一个以不同格式读取数据的函数.所有格式都是面向行或面向记录的,每种格式都有一个专用的解析功能,作为生成器实现.因此主读取函数获取输入和生成器,它从输入读取其各自的格式并将记录传递回主函数:
def read(stream, parsefunc):
for record in parsefunc(stream):
do_stuff(record)
Run Code Online (Sandbox Code Playgroud)
在哪里parsefunc是这样的:
def parsefunc(stream):
while not eof(stream):
rec = read_record(stream)
do some stuff
yield rec
Run Code Online (Sandbox Code Playgroud)
我面临的问题是,虽然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:
?????
Run Code Online (Sandbox Code Playgroud)
我不愿意这样做因为
try在一个不打算处理任何异常的函数中使用是没有意义的parsefunc,我不想用太多的帮助代码来混淆它们.有没有人建议更好的架构?