StopIteration 예외란 무엇인가?
파이썬에서 이터레이터(iterator)가 더 이상 반환할 값이 없으면, next() 메서드는 StopIteration 예외를 발생시킵니다. 이 예외는 프로그램의 오류를 의미하는 것이 아니라, 반복(iteration)이 정상적으로 끝났음을 알리는 신호입니다.
일반적인 for 문은 내부적으로 이 예외를 자동으로 처리하기 때문에 사용자가 직접 볼 일이 거의 없지만, next() 함수를 명시적으로 호출할 때는 이 예외를 직접 처리해 주어야 합니다.
try-except로 StopIteration 예외 잡기
아래 코드는 리스트로부터 이터레이터를 생성한 뒤, 요소를 하나씩 꺼내다가 예외가 발생하면 이를 try-except 블록으로 잡아 예외의 종류를 확인하는 예제입니다.
예제 코드
import sys
try:
z = [5, 9, 7]
i = iter(z)
print(i)
print(next(i))
print(next(i))
print(next(i))
print(next(i)) # 요소가 모두 소진되어 StopIteration 발생
except Exception as e:
print('발생한 예외:', repr(e))
print('예외 타입:', type(e))
실행 결과
<list_iterator object at 0x0000000002AF23C8>
5
9
7
발생한 예외: StopIteration()
예외 타입: <class 'StopIteration'>
코드 설명
iter(z): 리스트z에 대한 이터레이터 객체를 생성합니다.next(i): 이터레이터에서 다음 값을 하나씩 꺼냅니다. 리스트에는 요소가 3개뿐이므로 네 번째 호출에서StopIteration이 발생합니다.except Exception as e: 발생한 예외를 잡아 변수e에 저장하고,type(e)로 예외의 클래스를 출력합니다.
참고: 예외 없이 안전하게 값을 꺼내는 방법
파이썬 3에서는 next() 함수에 기본값(default)을 지정하여, 요소가 소진되었을 때 예외 대신 기본값을 반환받을 수 있습니다.
z = [5, 9, 7]
i = iter(z)
print(next(i, None)) # 5
print(next(i, None)) # 9
print(next(i, None)) # 7
print(next(i, None)) # None (예외 발생하지 않음)
이처럼 StopIteration은 반복의 종료를 알리는 정상적인 메커니즘이며, 상황에 따라 try-except로 직접 처리하거나 next()의 기본값 인수를 활용해 우아하게 다룰 수 있습니다.