2012-12-13 39 views
1

我需要捕獲由next(it)引發的異常,所以在這種情況下我不能使用常規的for循環。所以我寫了這樣的代碼:捕捉StopIteration時,爲什麼我不能跳出循環?

it = iter(xrange(5)) 
while True: 
    try: 
     num = it.next() 
     print(num) 
    except Exception as e: 
     print(e) # log and ignore 
    except StopIteration: 
     break 
print('finished') 

這是行不通的,數字用完後我得到一個無限循環。我究竟做錯了什麼?

回答

2

事實證明StopIteration實際上是Exception的一個子類,不只是另一個可拋類。所以StopIteration處理程序從未被調用過,因爲StopIteration已被Exception處理。我只需要把StopIteration處理器放在最前面:

it = iter(xrange(5)) 
while True: 
    try: 
     num = it.next() 
     print(num) 
    except StopIteration: 
     break 
    except Exception as e: 
     print(e) # log and ignore 
print('finished') 
+1

當然,最好的答案不是抓住'Exception',而是隻抓住特定的。 –

+0

總的來說,我當然同意,但在這種情況下,捕捉「例外」是正確的。 (我必須做大量的獨立計算,這需要幾天的時間,所以我只記錄哪些失敗;後來我可以修復造成這種錯誤並僅重新計算所需的錯誤)。 – Erik

+0

公平的 - 總是有特定的這是正確的電話。 –