Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

파이썬에서 StopIteration 예외를 잡는 방법

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()의 기본값 인수를 활용해 우아하게 다룰 수 있습니다.