【Python】GeneratorExitとは?発生原因や対処法・回避方法を解説

この記事では、Pythonのジェネレータ関数やジェネレータオブジェクトにおいて発生する GeneratorExit という特殊な例外について解説します。

GeneratorExitの発生原因や対処法、回避方法を理解することで、ジェネレータの扱い方をより深く理解することができます。

目次から探す

GeneratorExitとは?

GeneratorExitとは、Pythonのジェネレータ関数やジェネレータオブジェクトにおいて、ジェネレータの実行を終了するための特殊な例外です。

通常、ジェネレータはイテレーションが終了するまで値を生成し続けますが、GeneratorExitが発生するとジェネレータの実行が強制的に終了されます。

GeneratorExitの発生原因

ジェネレータオブジェクトは、ジェネレータ関数から生成されるオブジェクトです。

ジェネレータオブジェクトが不要になった場合、明示的に破棄することができますが、このとき、GeneratorExitが発生します。

def my_generator():
    yield 1
    yield 2
    yield 3
gen = my_generator()
next(gen)  # 1
next(gen)  # 2
del gen  # ジェネレータオブジェクトの破棄によりGeneratorExitが発生

次は、GeneratorExitの対処法について説明します。

GeneratorExitの対処法

GeneratorExitは、ジェネレータ関数やジェネレータオブジェクトが終了する際に発生する例外です。

GeneratorExitの発生原因については前のセクションで説明しましたが、ここではGeneratorExitの対処法について解説します。

finallyブロックを使用する

GeneratorExitを適切に処理するためには、finallyブロックを使用する方法があります。

finallyブロックは、tryブロック内の処理が正常に終了した場合や例外が発生した場合に必ず実行されるブロックです。

以下は、finallyブロックを使用してGeneratorExitを処理する例です。

def my_generator():
    try:
        # ジェネレータの処理
        yield 1
        yield 2
        yield 3
    finally:
        # finallyブロックでの処理
        print("GeneratorExitが発生しました")
gen = my_generator()
next(gen)  # 1を取得
del gen  # GeneratorExitを発生させる

上記の例では、ジェネレータ関数内でfinallyブロックを使用しています。

GeneratorExitが発生した場合には、finallyブロック内の処理が実行されます。

例外処理を組み込んだ上でclose()メソッドを呼び出す

GeneratorExitを処理する別の方法として、close()メソッドを呼び出す方法があります。

close()メソッドは、ジェネレータオブジェクトに対して呼び出すことができ、ジェネレータを終了させるためのメソッドです。

以下は、close()メソッドを使用してGeneratorExitを処理する例です。

def my_generator():
    try:
        # ジェネレータの処理
        yield 1
        yield 2
        yield 3
    except GeneratorExit:
        # GeneratorExitの処理
        print("GeneratorExitが発生しました")
    finally:
        # その他の処理
        print("ジェネレータの終了処理")
gen = my_generator()
next(gen)  # 1を取得
gen.close()  # GeneratorExitを発生させる

上記の例では、close()メソッドを呼び出すことでGeneratorExitを発生させています。

GeneratorExitが発生した場合には、exceptブロック内の処理が実行されます。

以上がGeneratorExitの対処法です。

適切な対処法を選択し、GeneratorExitを適切に処理することが重要です。

1 2
この記事のページ一覧
  1. 現在のページ
目次から探す