在生成器的消费者中处理异常
在生成器的消费者中处理异常
这是对处理生成器中抛出的异常的后续,并讨论了一个更普遍的问题。
我有一个函数,用于读取不同格式的数据。所有格式都是基于行或记录的,并且对于每种格式都有一个专用的解析函数,实现为生成器。因此,主读取函数会接收输入和一个生成器,该生成器从输入中读取其相应格式,并将记录返回给主函数:
def read(stream, parsefunc): for record in parsefunc(stream): do_stuff(record)
其中parsefunc
大致如下:
def parsefunc(stream): while not eof(stream): rec = read_record(stream) 进行一些操作 yield rec
我面临的问题是,虽然parsefunc
可能会抛出异常(例如从流中读取时),但它不知道如何处理异常。负责处理异常的函数是主read
函数。请注意,异常是基于每个记录发生的,因此即使一个记录失败,生成器也应该继续工作并返回记录,直到整个流耗尽。
在前一个问题中,我尝试将next(parsefunc)
放在一个try
代码块中,但结果证明这是行不通的。所以我必须在parsefunc
本身中添加try-except
,然后以某种方式将异常传递给消费者:
def parsefunc(stream): while not eof(stream): try: rec = read_record() yield rec except Exception as e: ?????
我对此非常不情愿,因为:
- 在一个不打算处理任何异常的函数中使用
try
没有意义 - 我不清楚如何将异常传递给消费函数
- 将会有很多格式和很多
parsefunc
,我不想让它们被过多的辅助代码所淹没。
有没有人对更好的架构有什么建议?