如何防止异常过早终止Python生成器/迭代器?
例如,请考虑以下事项:
#!/usr/bin/env python
def MyIter():
yield 1
yield 2
yield 3
raise Exception, 'blarg!'
yield 4 # this never happens
my_iter = MyIter()
while 1:
try:
value = my_iter.next()
print 'value:',value
except StopIteration:
break
except Exception, e:
print 'An error occurred: %s' % (e,)
我希望输出:
value: 1
value: 2
value: 3
An error occurred: blarg!
value: 4
然而,在异常之后,迭代器终止,并且即使我已经处理了异常并且没有破坏我的循环,也永远不会产生值4。为什么这样做?
答案 0 :(得分:8)
生成器需要在其自身内处理异常;如果它引发未处理的异常,就会终止它,就像任何其他函数一样。
答案 1 :(得分:2)
您需要处理生成器中可能发生的任何异常:
def MyIter():
yield 1
yield 2
yield 3
try:
raise Exception, 'blarg!'
except Exception:
pass
yield 4 # this will happen