【发布时间】:2020-09-26 04:29:49
【问题描述】:
感谢您提出我的问题。我试图把我的问题说清楚,但如果因为我的英语还有不清楚的部分,请告诉我。
我正在研究 Python 协程,并且读到在生成器上调用 close() 方法类似于将 GeneratorExit 扔给生成器。所以我尝试如下。
def gen(n):
while True:
yield n
test = gen(10)
next(test)
test.throw(GeneratorExit)
然后发生GeneratorExit 异常。但是,当我尝试test.close() 时,它没有引发任何异常。
所以我稍微修改了上面的代码;
def gen(n):
while True:
try:
yield n
except GeneratorExit:
break
test = gen(10)
next(test)
test.throw(GeneratorExit)
在处理GeneratorExit 时,它没有被引发,但发生了StopIteration 异常。我知道如果没有更多的收益,StopIteration 异常就会上升。但是,当我使用修改后的代码再次尝试 test.close() 时,它没有被提出。
您能告诉我抛出GeneratorExit 和调用close() 方法有什么区别吗?
更准确地说,我可以理解为什么test.throw(GeneratorExit) 会出现StopIteration 和GeneratorExit 异常,但不知道为什么使用test.close() 时不会引发这些异常
谢谢。
【问题讨论】:
-
您必须在
except块中重新引发异常。简单的break不处理异常。 -
感谢您的评论。我试过了,但是我像上面写的未修改的代码一样再次提出了GeneratorExit。