2017-08-30 64 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异常。