我有一个生成器和一个使用它的函数:

def read():
    while something():
        yield something_else()

def process():
    for item in read():
        do stuff

如果生成器抛出异常,我想在消费者函数中处理它,然后继续使用迭代器,直到它耗尽。请注意,我不想在生成器中包含任何异常处理代码。

我想过这样的事情:
reader = read()
while True:
    try:
        item = next(reader)
    except StopIteration:
        break
    except Exception as e:
        log error
        continue
    do_stuff(item)

但这对我来说看起来很尴尬。

最佳答案

这也是我不确定我是否正确/优雅地处理的事情。

我所做的是从生成器中提取 yieldException,然后将其提升到其他地方。像:

class myException(Exception):
    def __init__(self, ...)
    ...

def g():
    ...
    if everything_is_ok:
        yield result
    else:
        yield myException(...)

my_gen = g()
while True:
    try:
        n = next(my_gen)
        if isinstance(n, myException):
            raise n
    except StopIteration:
        break
    except myException as e:
        # Deal with exception, log, print, continue, break etc
    else:
        # Consume n

这样我仍然会在不引发异常的情况下继续执行异常,这会导致生成器功能停止。主要缺点是我需要在每次迭代时用 isinstance 检查产生的结果。我不喜欢可以产生不同类型结果的生成器,但将其用作最后的手段。

关于python - 处理在生成器中抛出的异常,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11366064/

10-13 05:03