我对在 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。
try: yield some_operation(foo); except: pass
。你可能认为这将忽略 some_operation 中的错误,但实际上它也会忽略由你正在 yield 到的调用站点触发的早期退出 GeneratorExit!相反,尝试在 try-except 中执行 some_operation,并在该 try-except 之后进行 yield。或者处理一个更小范围的异常! - btown