相关疑难解决方法(0)

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

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

我有一个以不同格式读取数据的函数.所有格式都是面向行或面向记录的,每种格式都有一个专用的解析功能,作为生成器实现.因此主读取函数获取输入和生成器,它从输入读取其各自的格式并将记录传递回主函数:

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-exceptparsefunc自身,然后以某种方式向消费者提供例外:

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,我不想用太多的帮助代码来混淆它们.

有没有人建议更好的架构?

针对googlers的说明:除了最佳答案外,还要关注发送Jon的帖子 - 非常聪明且富有洞察力的内容.

python exception-handling generator

28
推荐指数
3
解决办法
7141
查看次数

标签 统计

exception-handling ×1

generator ×1

python ×1