gpt4 book ai didi

python - 当协程引发异常时会发生什么?

转载 作者:太空宇宙 更新时间:2023-11-04 10:48:57 25 4
gpt4 key购买 nike

我不确定下面这段代码到底发生了什么:

def coroutine():
lst = []
try:
while True:
item = (yield lst)
if item == 3:
raise ValueError
print('append {}'.format(item))
lst.append(item)
except GeneratorExit:
print('GeneratorExit')

crt = coroutine()

next(crt)
print(crt.send(1))
print(crt.send(2))

try:
print(crt.send(3))
except ValueError:
pass

print(crt.send(4))

这个输出:

append 1
[1]
append 2
[1, 2]

Traceback (most recent call last):
File "D:\Documents and Settings\Brecht\Desktop\crt.py", line 25, in <module>
print(crt.send(4))
StopIteration

当使用调试器单步执行代码时,在 raise ValueError 上,执行跳转到 except GeneratorExit:,但不执行此 except 子句的主体('GeneratorExit ' 未打印)。为什么不呢?

除此之外,我不认为我可以在它抛出异常后以任何方式恢复协程?有什么特别的理由不允许这样做吗?这至少在我的特定用例中会有用:)

最佳答案

当您抛出异常时,代码流总是中断。一旦在其中抛出异常,就无法恢复中断的生成器。

来自 PEP 342 (Coroutines via Enhanced Generators) :

As with the next() method, the send() method returns the next value yielded by the generator-iterator, or raises StopIteration if the generator exits normally, or has already exited. If the generator raises an uncaught exception, it is propagated to send()'s caller.

至于调试器跳转到except 行:您刚刚抛出一个异常,解释器正在测试异常是否被该行捕获。因为它只会捕获 GeneratorExit,所以生成器会在该点退出。

关于python - 当协程引发异常时会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15372018/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com