python-3.x 在for循环上为StopIteration引发RuntimeError [重复]

3lxsmp7m  于 2023-01-18  发布在  Python
关注(0)|答案(1)|浏览(217)
    • 此问题在此处已有答案**:

"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异常来完成循环吗?为什么上面的代码会导致这样的错误?

axkjgtzd

axkjgtzd1#

for循环确实会捕获StopIteration异常以完成循环。但是,您提供的示例中的StopIteration异常是在for循环完成迭代后引发的。这意味着StopIteration异常不会被for循环捕获,而是作为未处理的异常引发,从而导致您看到的RuntimeError。
为了实现您想要的行为,您可以将for循环 Package 在try-except块中,并捕获StopIteration异常。通过这种方式,您可以处理异常并优雅地退出循环,而不会引发错误。
此外,您可以使用return语句而不是raise StopIteration来停止生成器函数的执行,它将通知for循环停止迭代。

相关问题