エラー辞典

GeneratorExit

ジェネレータ(yieldを使う関数)が、途中で強制終了されたときに内部で発生する例外です。

原因

ジェネレータのclose()メソッドが呼ばれたり、ジェネレータが最後まで使われずにガベージコレクションされたりすることが原因で、通常は意識せずに使うことができます。

エラーになるコード例

def counter():
    try:
        n = 0
        while True:
            yield n
            n += 1
    except GeneratorExit:
        print('ジェネレータが終了されました')

gen = counter()
print(next(gen))
gen.close()
GeneratorExit

修正版

# 上記の例のように、ジェネレータ内でtry/exceptを使うことで
# 終了時の後片付け処理を書くことができます

よくある間違い

  • ジェネレータの仕組みを理解しないまま、close()を呼んだ後に再度next()しようとしてStopIterationになる
  • GeneratorExitを自分でraiseしようとしてしまう(本来はPython内部が発生させるものです)

← エラー辞典に戻る