防止异常终止Python迭代器

4

如何防止异常过早地终止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也不会被生成。为什么会这样呢?

你应该使用continue吗? - heltonbiker
异常的整个意义在于提前终止任何未被“except”处理的上下文。 - Eric
2个回答

8

生成器需要在其内部处理异常;如果它引发未处理的异常,它将被终止,就像任何其他函数一样。


+1 虽然我不喜欢这个表达方式 如果引发异常,它会终止... 这似乎不准确。 - Vyktor
缺少“未处理”是我的意思。 - Vyktor

2

您需要处理生成器中可能发生的任何异常:

def MyIter():
    yield 1
    yield 2
    yield 3
    try:
       raise Exception, 'blarg!'
    except Exception:
       pass
    yield 4 # this will happen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接