我有一个生成器和一个使用它的函数:
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)
但这对我来说看起来很尴尬。
最佳答案
这也是我不确定我是否正确/优雅地处理的事情。
我所做的是从生成器中提取 yield
和 Exception
,然后将其提升到其他地方。像:
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/