2013-04-26 50 views
4

如何防止异常过早终止Python生成器/迭代器?防止终止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

你应该使用'continue'? – heltonbiker 2013-04-26 19:58:36

+0

例外的要点是过早地终止任何他们不是'除了'的上下文 – Eric 2013-04-26 20:07:09

回答

8

生成器需要处理它自身内的异常;如果它引发一个未处理的异常,就像其他函数一样,它会被终止。

+0

+1,尽管我不喜欢公式*它会在引发异常时终止* ......这看起来不准确。 – Vyktor 2013-04-26 20:03:39

+0

“它退出”也许...... – kindall 2013-04-26 20:04:40

+0

缺少“未处理”是我的意思 – Vyktor 2013-04-26 20:37:08

2

您需要处理可能发生的任何发电机例外:

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