在生成器的消费者中处理异常

6 浏览
0 Comments

在生成器的消费者中处理异常

这是对处理生成器中抛出的异常的后续,并讨论了一个更普遍的问题。

我有一个函数,用于读取不同格式的数据。所有格式都是基于行或记录的,并且对于每种格式都有一个专用的解析函数,实现为生成器。因此,主读取函数会接收输入和一个生成器,该生成器从输入中读取其相应格式,并将记录返回给主函数:

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,我不想让它们被过多的辅助代码所淹没。

有没有人对更好的架构有什么建议?

给谷歌的一个提示:除了最佳答案外,还要注意senderleJon的帖子-非常聪明和有深度的内容。

0