GeneratorExit in while循环

时间:2015-01-03 14:41:19

标签: python

我不清楚在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,因为&#34;需要进行一些清理。&#34;打印,但我不明白为什么会出现RuntimeError。

3 个答案:

答案 0 :(得分:11)

“当调用g.close()时,会出现GeneratorExit”

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

请参阅以下文档:

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

该异常将导致RuntimeError

在循环内部引发上述异常后,实际处理它,并且您看到打印的错误消息。但是,循环继续,它仍然试图产生9.那就是当你看到RuntimeError时。因此,在循环外部移动异常处理可以解决问题。

答案 1 :(得分:3)

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

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

答案 2 :(得分:2)

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

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