while 循环中的 GeneratorExit
GeneratorExit in while loop
我不清楚在 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被捕获,因为打印了"Need to do some clean up.",但我不明白为什么会出现RuntimeError。
"It appears when g.close() is called, GeneratorExit is catched"
是的,调用生成器的 close() 方法时会引发 GeneratorExit。
请参阅以下文档:
https://docs.python.org/2/library/exceptions.html
并且异常会引发RuntimeError
上述异常在循环内部抛出后,实际上是被处理了,你会看到打印的错误信息。但是,循环继续,它仍然尝试产生 9。这就是您看到 RuntimeError 的时候。因此,将异常处理移到循环之外可以解决问题。
您正在循环中捕获异常,因此即使它接收到异常,它仍会尝试 yield
下一次迭代中的值。
将异常处理移到循环之外。
只需在打印"Need to do some clean up."
后添加一条return
语句即可。然后一切正常:)。这是首选方式,尤其是当您无法将异常移出时
while True:
try:
yield 9
except GeneratorExit:
print "Need to do some clean up."
return
我不清楚在 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被捕获,因为打印了"Need to do some clean up.",但我不明白为什么会出现RuntimeError。
"It appears when g.close() is called, GeneratorExit is catched"
是的,调用生成器的 close() 方法时会引发 GeneratorExit。
请参阅以下文档:
https://docs.python.org/2/library/exceptions.html
并且异常会引发RuntimeError
上述异常在循环内部抛出后,实际上是被处理了,你会看到打印的错误信息。但是,循环继续,它仍然尝试产生 9。这就是您看到 RuntimeError 的时候。因此,将异常处理移到循环之外可以解决问题。
您正在循环中捕获异常,因此即使它接收到异常,它仍会尝试 yield
下一次迭代中的值。
将异常处理移到循环之外。
只需在打印"Need to do some clean up."
后添加一条return
语句即可。然后一切正常:)。这是首选方式,尤其是当您无法将异常移出时
while True:
try:
yield 9
except GeneratorExit:
print "Need to do some clean up."
return