2017-08-30 63 views
0

我在過去了解到,如果程序中存在某些不正常的情況,應該觸發Exception。例如讀取文件時發生錯誤。 如果你看這個python代碼,你會看到StopIteration Exception被激發。但這不是該計劃的一種異常行爲。所以我的問題是:我們應該在這種情況下舉一個例外嗎?謝謝Python迭代器異常

class MyIterator(): 
    def __init__(self, n): 
     self.max = n 

    def __iter__(self): 
     self.count = 0 
     return self 

    # For Python3 
    def __next__(self): 
     if self.count == self.max: 
      raise StopIteration 
     self.count += 1 
     return self.count - 1 

c = MyIterator(4) 
for i in c: 
    print(i) 
+2

是的,你應該。它告訴迭代器到達最後的for循環。 – spectras

+3

具體來說:是的,這就是迭代器協議的工作原理,[如文檔所述](https://docs.python.org/3/library/stdtypes.html#typeiter)。一般來說:在Python中使用異常進行流量控制是很常見的事情 - 它更容易要求原諒而不是權限*(https://docs.python.org/3/glossary.html#term-eafp)。順便說一下, – jonrsharpe

+0

相關文檔是[here](https://docs.python.org/3/howto/functional.html#iterators)。 – spectras

回答

2

是的。你不僅應該在這裏舉個例外,你必須在這裏提出一個例外。 This is what the iterator protocol calls for

iterator.__next__()

返回從容器中的一個項目。如果沒有其他項目,請提出StopIteration例外。 [...]

你在正確的異常應該提高,當該程序是在特殊情況下(是的,我知道這聽起來多餘的)。但是,Python中的異常與大多數語言不同。 Python中的例外用於迭代等核心語言功能,並且它們優於條件語句。 Python中的常見的成語是"It's easier to ask for foreignness instead of permission"

更容易請求原諒比許可。這種常見的Python編碼風格假定存在有效的鍵或屬性,並且如果假設證明是錯誤的,則捕獲異常。這種乾淨而快速的風格的特點是存在許多嘗試和除外聲明。該技術與LBYL風格對比常見的許多其他語言如C

try語句也被罰調整,以允許用戶能夠對如何處理異常的控制。它允許else,finally和多個except類別用於與它共軛。

+0

@Blckknght謝謝,我不小心發佈了鏈接,而不是鏈接上的內容。 –

+1

這就是我的想法。我最初只是爲了解決「你的」 - >「你」的錯誤而編輯,但同時尋找其他需要更改的東西,並認爲它看起來像複製和粘貼錯誤。 – Blckknght

1

是的,絕對。當self.count等於self.max時,StopIteration異常需要被提升爲信號迭代器,這意味着沒有更多元素。看看Python的Iterator documentation

如果有流中沒有更多的元素,下一個()必須提高 StopIteration異常。