GeneratorExit
ジェネレータ(yieldを使う関数)が、途中で強制終了されたときに内部で発生する例外です。
原因
ジェネレータのclose()メソッドが呼ばれたり、ジェネレータが最後まで使われずにガベージコレクションされたりすることが原因で、通常は意識せずに使うことができます。
エラーになるコード例
def counter():
try:
n = 0
while True:
yield n
n += 1
except GeneratorExit:
print('ジェネレータが終了されました')
gen = counter()
print(next(gen))
gen.close()修正版
# 上記の例のように、ジェネレータ内でtry/exceptを使うことで
# 終了時の後片付け処理を書くことができますよくある間違い
- ジェネレータの仕組みを理解しないまま、close()を呼んだ後に再度next()しようとしてStopIterationになる
- GeneratorExitを自分でraiseしようとしてしまう(本来はPython内部が発生させるものです)