GeneratorExit, close()不会导致回溯/异常


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()文档。

声明StopIterationGeneratorExit异常在内部用于指示生成器如何退出,因此它们是唯一不传播给调用者的异常。

所以如果你想重新引发GeneratorExit异常,你可能必须捕获它并将其封装在另一个自定义异常中。

最新更新