首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在使用者中处理生成器异常

在使用者中处理生成器异常
EN

Stack Overflow用户
提问于 2012-07-06 17:21:34
回答 8查看 8.9K关注 0票数 36

这是对Handle an exception thrown in a generator的后续,并讨论了一个更普遍的问题。

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

代码语言:javascript
运行
复制
def read(stream, parsefunc):
    for record in parsefunc(stream):
        do_stuff(record)

其中parsefunc是这样的:

代码语言:javascript
运行
复制
def parsefunc(stream):
    while not eof(stream):
        rec = read_record(stream)
        do some stuff
        yield rec

我面临的问题是,虽然parsefunc可以抛出异常(例如,当从流读取时),但它不知道如何处理它。负责处理异常的函数是主要的read函数。请注意,异常发生在每条记录的基础上,因此即使一条记录失败,生成器也应该继续其工作并生成记录,直到整个流耗尽为止。

在前面的问题中,我试图将next(parsefunc)放在一个try块中,但事实证明,这是行不通的。因此,我必须将try-except添加到parsefunc本身,然后以某种方式将异常传递给消费者:

代码语言:javascript
运行
复制
def parsefunc(stream):
    while not eof(stream):
        try:
            rec = read_record()
            yield rec
        except Exception as e:
            ?????

我很不愿意这么做,因为

  • 在不打算处理任何异常的函数中使用try是没有意义的
  • 我不清楚如何将异常传递给消费函数
  • 会有很多格式和许多parsefunc,我不想让它们被太多的辅助代码所干扰。

有没有人建议更好的建筑?

谷歌员工注意:除了上面的答案,还要注意senderle'sJon's的帖子--非常聪明和有洞察力的东西。

EN

Stack Overflow用户

发布于 2012-07-06 19:20:47

关于将异常从生成器传播到消费函数的要点,可以尝试使用错误代码(一组错误代码)来指示错误。虽然不是很优雅,但这是您可以想到的一种方法。

例如,在下面的代码中,产生一个类似于-1的值,当您期望一组正整数时,会向调用函数发出一个错误信号。

代码语言:javascript
运行
复制
In [1]: def f():
  ...:     yield 1
  ...:     try:
  ...:         2/0
  ...:     except ZeroDivisionError,e:
  ...:         yield -1
  ...:     yield 3
  ...:     


In [2]: g = f()

In [3]: next(g)
Out[3]: 1

In [4]: next(g)
Out[4]: -1

In [5]: next(g)
Out[5]: 3
票数 1
EN
查看全部 8 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11366892

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档