2011-09-19 91 views
5

Python中是否有任何方法可以在迭代器/生成器拋出的異常之後繼續迭代?像下面的代碼一樣,是否有任何方法可以跳過ZeroDivisionError並繼續循環通過gener()而不需要執行run()函數?在python中的迭代器/生成器異常提升後繼續

def gener(): 
    a = [1,2,3,4,0, 5, 6,7, 8, 0, 9] 
    for i in a: 
     yield 2/i 

def run(): 
    for i in gener(): 
     print i 

#---- run script ----# 

try: 
    run() 
except ZeroDivisionError: 
    print 'what magick should i put here?' 

回答

8

try/except的合乎邏輯的地方是哪裏有問題的計算髮生地:

def gener(): 
    a = [1,2,3,4,0, 5, 6,7, 8, 0, 9] 
    for i in a: 
     try: 
      yield 2/i 
     except ZeroDivisionError: 
      pass 
+1

在這種簡單的情況下可能是的。但是如果我們需要一個默認停止迭代的函數,但是我們可以繼續處理下一個捕獲異常的項目?我們應該有一個外部信號,說明有什麼不對。 – sergzach

+0

@sergzach:我們可以做'yield None'而不是'pass',並在調用者中捕獲這個特殊情況。 –

2

一個可能的解決方案只是包裝問題的代碼放到try ... except塊:

def gener(): 
    a = [1,2,3,4,0, 5, 6,7, 8, 0, 9] 
    for i in a: 
     try: 
      div_result = 2/i 
     except ZeroDivisionError: 
      div_result = None 

     yield div_result 
0

我不確定,但如果您想要了解發生錯誤的位置,可能會更適合您:

def gener(): 
    a = [1, 2, 3, 4, 0, 5, 6, 7, 8, 0, 9] 
    errors = [] 
    for idx, i in enumerate(a): 
     try: 
      yield 2/i 
     except ZeroDivisionError: 
      errors.append('ZeroDivisionError occured at idx = {}'.format(idx)) 
    raise RuntimeWarning('\n'.join(errors))