python – 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()不会生成回溯!为什么?但是除了active之外,我能够捕获GeneratorExit.怎么可能?

如果GeneratorExit是一个例外,那么它应该像所有其他异常一样运行并传播它正在做的事情 – 因此我能够使用except来捕获它.但是当然没有除了父python解释器之外应该捕获回溯,就像所有其他异常一样.这里有什么魔力?

最佳答案 见
generator.close() documentation.

据说StopIteration和GeneratorExit异常在内部用于指示生成器如何退出,因此是唯一不会传播给调用者的异常.

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

点赞