본문 바로가기
Error(Exception)/ERROR-PYTHON

[python] GeneratorExit

by 조조군 2024. 11. 21.
반응형

오류: GeneratorExit

1. 오류 설명

GeneratorExit제너레이터(generator)가 종료될 때 발생하는 예외입니다. 이는 close() 메서드가 호출될 때 내부적으로 발생하며, 제너레이터가 정리 작업을 수행할 수 있도록 설계되었습니다. GeneratorExit는 제너레이터 내부에서 처리할 필요가 거의 없으며, 처리하더라도 반드시 재발생시켜야 합니다. 이 예외는 StopIteration과 비슷하지만, 제너레이터 종료 시에만 발생한다는 점에서 다릅니다.


2. 오류 예시

def my_generator():
    try:
        yield 1
        yield 2
    except GeneratorExit:
        print("Generator is closing!")

gen = my_generator()
next(gen)  # 1
gen.close()  # GeneratorExit 발생

출력:

Generator is closing!

3. 오류 해결책

  1. 정상적인 종료 처리:
    • close()를 호출하기 전에 제너레이터의 작업을 모두 끝내는 것이 가장 좋습니다.
    • 제너레이터 내부에서 GeneratorExit를 캐치하여 적절한 정리 작업을 수행한 뒤 재발생시켜야 합니다.
  2. 예외를 재발생시키기:
    • GeneratorExit를 처리한 후 반드시 raise를 통해 예외를 다시 발생시켜야 합니다.
    • 이를 하지 않으면 제너레이터의 종료가 제대로 이루어지지 않습니다.

4. 오류 예제 코드 및 해결 코드

오류 코드
def faulty_generator():
    try:
        yield "Hello"
        yield "World"
    except GeneratorExit:
        print("Closing generator...")
        # 여기서 GeneratorExit를 다시 발생시키지 않음 -> 문제 발생
    print("Generator closed.")

gen = faulty_generator()
next(gen)  # "Hello"
gen.close()  # GeneratorExit 발생, 이후 제너레이터 비정상 종료
해결 코드
def proper_generator():
    try:
        yield "Hello"
        yield "World"
    except GeneratorExit:
        print("Closing generator...")
        raise  # GeneratorExit를 반드시 다시 발생시킴

gen = proper_generator()
next(gen)  # "Hello"
gen.close()  # GeneratorExit 발생, 정상적으로 처리 후 종료

출력:

Closing generator...

이처럼 GeneratorExit는 정상적인 제너레이터 종료 과정에서 발생하는 예외이며, 이를 재발생시키는 것이 중요합니다.

반응형

'Error(Exception) > ERROR-PYTHON' 카테고리의 다른 글

[python] RuntimeError  (0) 2024.11.22
[python] ImportError  (0) 2024.11.22
[python] FloatingPointError  (2) 2024.11.20
[python] EOFError  (0) 2024.11.19
[python] PythonFinalizationError  (0) 2024.11.18

댓글