- 此问题在此处已有答案**:
"RuntimeError: generator raised StopIteration" every time I try to run app(7个答案)
13小时前关门了。
我想创建一个Iterator来运行几个检查,yield
是一个对象,它会跟随所有的检查,如果没有找到对象,它会引发一个StopIteration
来退出循环,类似于下面的代码:
def gen():
for i in range(3):
yield i
raise StopIteration("Done")
for i in gen():
print(i)
但是当我运行这个程序时,我得到了以下输出:
0
1
2
---------------------------------------------------------------------------
StopIteration Traceback (most recent call last)
<ipython-input-19-56228d701618> in gen()
4
----> 5 raise StopIteration("Done")
StopIteration: Done
The above exception was the direct cause of the following exception:
RuntimeError Traceback (most recent call last)
<ipython-input-20-a753ba4ac5a8> in <module>
----> 1 for i in gen():
2 print(i)
我后来修改了代码,以不同的方式退出,但这让我很好奇,for
循环不是捕捉StopIteration
异常来完成循环吗?为什么上面的代码会导致这样的错误?
1条答案
按热度按时间axkjgtzd1#
for循环确实会捕获StopIteration异常以完成循环。但是,您提供的示例中的StopIteration异常是在for循环完成迭代后引发的。这意味着StopIteration异常不会被for循环捕获,而是作为未处理的异常引发,从而导致您看到的RuntimeError。
为了实现您想要的行为,您可以将for循环 Package 在try-except块中,并捕获StopIteration异常。通过这种方式,您可以处理异常并优雅地退出循环,而不会引发错误。
此外,您可以使用return语句而不是raise StopIteration来停止生成器函数的执行,它将通知for循环停止迭代。