次のコードで正確に何が起こるかわかりません。
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」は出力されません)。なぜだめですか?
それを除けば、例外がスローされた後、コルーチンを再開できるとは思いませんか? これを許可しない特別な理由はありますか? これは、少なくとも私の特定のユースケースでは役立ちます:)