2013-04-26 37 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