2014-01-07 71 views
0

我想捕獲intetartor在迭代器循環之外迭代中拋出的異常。for語句中的捕獲異常

這是代碼的一個非常簡化的版本:

class C(object): 
    def _iter(self): 
     for x in range(100): 
      yield x, x + 3 

    def doit(self): 
     for a, b in self._iter(): # <-- how can I capture an excepcion here? 
      print(a, b) 

我能捕捉到這個循環的異常,但後來我我怎麼能傳遞錯誤的doit方法報告?我想讓異常一直傳播到doit函數,我可以收集錯誤並繼續下一個元素。

另外我需要處理所有的迭代,收集錯誤並處理所有的迭代沒有錯誤,所以我可以報告所有的錯誤在最後。這樣,單個錯誤不會阻止處理所有其他元素。

+0

爲什麼不與錯誤處理* *裏面的'_iter()'實例方法? – jonrsharpe

+0

@ F.C。你是否想在self._iter()中爲a,b繼續循環:'在捕獲並處理了一個錯誤之後?我是唯一一個像這樣解釋它嗎? – Nabla

+0

@jonrsharpe因爲'_iter'裏面我不能收集所有的錯誤,並且因爲'_iter'必須返回'doit'可以使用的東西。 –

回答

0

使用try-catch塊。

try: 
    for a, b in self._iter(): 
    print(a, b) 

except: 
    #throw your exception text here 
+0

這不是OP所要求的:「我可以在哪裏收集錯誤並繼續下一個元素」。 – Nabla

0

這應該工作:

class C(object): 
    def _iter(self): 
     try: 
      for x in range(100): 
      yield x, x + 3 
     except Exception as e: 
      raise e 

    def doit(self): 
     try: 
      for a, b in self._iter(): # <-- how can I capture an excepcion here? 
       print(a, b) 
     except Exception as e: 
      # do something with e 
     # rest of the python code here 
+0

這將結束髮生器,如果發生異常,而OP想要繼續它。 – Nabla