引发了异常。 finally 块在生成器关闭时执行。通过在生成器上下文中引发 GeneratorExit exception 来关闭生成器。
被忽略的异常,因为生成器在被删除之前不会关闭(在这种情况下,当 Python 退出时自动关闭);生成器__del__ 处理程序关闭生成器,从而触发finally: 块:
>>> def mycoroutine():
... try:
... while True:
... data = (yield)
... print data
... finally:
... raise ValueError
... print "END"
...
>>> co = mycoroutine()
>>> co.next()
>>> co.close()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 7, in mycoroutine
ValueError
>>> co = mycoroutine()
>>> co.next()
>>> del co
Exception ValueError: ValueError() in <generator object mycoroutine at 0x1046a9fa0> ignored
清理期间引发的异常总是被忽略;见object.__del__() documentation:
警告:由于__del__()的危险情况
方法被调用,在它们执行期间发生的异常是
忽略,并改为向sys.stderr 打印警告。
解决方案是在清理生成器时不引发异常,或者通过显式关闭生成器来捕获异常:
>>> co = mycoroutine()
>>> co.next()
>>> try:
... co.close()
... except ValueError:
... pass
...
>>> del co
>>> # No exception was raised
...
您还可以捕获GeneratorExit 异常并在此时执行一些清理:
def mycoroutine():
try:
while True:
data = (yield)
print data
except GeneratorExit:
print "Generator exiting!"
但请注意,除StopIteration 或GeneratorExit 之外的任何异常都将始终传播;见generator.close() documentation:
如果生成器函数随后引发StopIteration(通过正常退出,或由于已被关闭)或GeneratorExit(通过未捕获异常),则关闭返回其调用者。如果生成器产生一个值,则会引发 RuntimeError。如果生成器引发任何其他异常,则会将其传播给调用者。