def receiver():
print("Ready to receive")
# try:
while True:
n = (yield)
print("Got %s" % n)
# except GeneratorExit:
# print("Receiver done")
r = receiver()
r.next()
r.send(10)
r.close()
当我注释掉GeneratorExit
时,close()
不生成回溯!为什么?然而,与except
活跃,我能够抓住GeneratorExit
。这怎么可能呢?
如果GeneratorExit
是一个异常,那么它应该表现得像所有其他异常一样,并传播它正在做的事情-因此我能够使用except
捕获它。但是可以肯定的是,如果没有except
,父python解释器应该像处理所有其他异常一样捕获回溯。这里发生了什么魔法?
参见generator.close()文档。
声明StopIteration
和GeneratorExit
异常在内部用于指示生成器如何退出,因此它们是唯一不传播给调用者的异常。
所以如果你想重新引发GeneratorExit
异常,你可能必须捕获它并将其封装在另一个自定义异常中。