【问题标题】:GeneratorExit in while loop循环中的 GeneratorExit
【发布时间】:2015-01-03 14:41:19
【问题描述】:

我不清楚在 while 循环中捕获 GeneratorExit 的行为,这是我的代码:

# python 
Python 2.6.6 (r266:84292, Sep  4 2013, 07:46:00) 
[GCC 4.4.7 20120313 (Red Hat 4.4.7-3)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> def func():
...     while True:
...         try:
...             yield 9
...         except GeneratorExit:
...             print "Need to do some clean up."
... 
>>> g = func()
>>> g.next()
9
>>> g.close()
Need to do some clean up.
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
RuntimeError: generator ignored GeneratorExit

它出现在调用 g.close() 时,GeneratorExit 被捕获,因为“需要做一些清理工作”。已打印,但我不明白为什么会出现 RuntimeError。

【问题讨论】:

    标签: python


    【解决方案1】:

    “调用g.close()时出现,GeneratorExit被捕获”

    是的,GeneratorExit 在调用生成器的 close() 方法时引发。

    请参阅以下文档:

    https://docs.python.org/2/library/exceptions.html

    并且异常会导致RuntimeError

    在循环内引发上述异常后,它实际上被处理了,您会看到打印的错误消息。但是,循环继续,它仍然试图产生 9。这时您会看到 RuntimeError。因此,将异常处理移到循环之外可以解决问题。

    【讨论】:

    • 但是如果我在 while 循环之外捕获 GeneratorExit,那么我将看不到 RuntimeError,似乎一切正常。
    • @Eric 添加了另一个说明。
    【解决方案2】:

    只需在打印"Need to do some clean up." 后添加return 语句。那么一切正常:)。这是首选方式,尤其是当您无法将异常移出时

    while True:
        try:
            yield 9
         except GeneratorExit:
            print "Need to do some clean up."
            return
    

    【讨论】:

      【解决方案3】:

      您正在循环内捕获异常,因此即使它接收到异常,它仍会尝试在下一次迭代中 yield 一个值。

      将异常处理移到循环之外。

      【讨论】:

      • 谢谢@karoly-horvath。
      猜你喜欢
      • 2018-03-14
      • 2016-10-27
      • 2018-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-28
      • 2013-11-05
      相关资源
      最近更新 更多