GeneratorExit,close()不会导致回溯/异常 - 如何?

时间:2016-06-29 05:33:23

标签: python

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解释器应该像所有其他异常一样捕获回溯。这里有什么魔力?

1 个答案:

答案 0 :(得分:2)

请参阅generator.close() documentation

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

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