Python 에러 핸들링: 실전 가이드

개발을 하다 보면 크고 작은 에러를 마주치게 됩니다. 특히 Python에서는 다양한 예외가 발생할 수 있으며, 이를 효과적으로 처리하지 않으면 프로그램이 중단될 수 있습니다. 이 글에서는 중·고급 개발자를 대상으로 Python에서 자주 발생하는 오류 유형과 그에 대한 효과적인 처리 방법을 정리해보겠습니다.

1. TypeError: ‘type’ object is not subscriptable

원인: 해당 에러는 리스트, 튜플, 딕셔너리와 같은 서브스크립트(subscript) 가능한 객체가 아닌 타입을 서브스크립트로 접근하려 할 때 발생합니다.

예제 코드:

class Sample:
    pass

print(Sample[0])  # TypeError 발생

해결 방법:

  • 클래스 또는 타입 객체가 아닌 리스트, 튜플, 딕셔너리를 사용해야 합니다.
  • 제네릭(Generic) 사용 시 올바르게 타입을 지정해야 합니다.
sample_instance = Sample()
print(sample_instance)  # 올바른 객체 사용

2. IndexError: list index out of range

원인: 리스트에서 존재하지 않는 인덱스에 접근할 때 발생하는 오류입니다.

예제 코드:

my_list = [1, 2, 3]
print(my_list[5])  # IndexError 발생

해결 방법:

  • 리스트의 길이를 확인하고 접근해야 합니다.
  • try-except를 사용하여 예외를 적절히 처리합니다.
try:
    print(my_list[5])
except IndexError:
    print("인덱스 범위를 벗어났습니다.")

3. ValueError: 올바르지 않은 값 사용

원인: 함수나 연산에서 허용되지 않는 값을 입력받을 때 발생합니다.

예제 코드:

def rsp(mine, yours):
    allowed = ['가위', '바위', '보']
    if mine not in allowed or yours not in allowed:
        raise ValueError("잘못된 입력값입니다.")

try:
    rsp('가위', '바')
except ValueError as e:
    print(e)

해결 방법:

  • 입력값 검증을 철저히 합니다.
  • 사용자에게 적절한 피드백을 제공합니다.

4. StopIteration: 반복 종료 예외

원인: 반복(iteration) 중 StopIteration이 발생하면 루프가 비정상적으로 종료될 수 있습니다.

예제 코드:

school = {'1반': [150, 156, 179, 191, 199], '2반': [150, 195, 179, 191, 199]}

try:
    for class_number, students in school.items():
        for student in students:
            if student > 190:
                print(class_number, '190을 넘는 학생이 있습니다.')
                raise StopIteration  # 잘못된 사용법
except StopIteration:
    print('정상 종료')

해결 방법:

  • StopIteration을 명시적으로 사용하기보다는 break를 활용하여 제어 흐름을 정리하는 것이 좋습니다.
for class_number, students in school.items():
    for student in students:
        if student > 190:
            print(class_number, '190을 넘는 학생이 있습니다.')
            break

5. ImportError: 모듈이 존재하지 않음

원인: 존재하지 않는 모듈을 임포트하려고 할 때 발생하는 오류입니다.

예제 코드:

try:
    import your_module
except ImportError:
    print('모듈이 없습니다.')

해결 방법:

  • pip install을 통해 필요한 패키지를 설치합니다.
  • 가상 환경을 확인하고 필요한 모듈이 설치되어 있는지 점검합니다.
pip install your_module

6. 예외 처리를 보다 효율적으로

Python에서는 다양한 예외가 발생할 수 있으므로, 예외 처리를 효과적으로 구성하는 것이 중요합니다. 모든 예외를 잡는 것은 권장되지 않으며, 예상 가능한 예외에 대해 구체적인 핸들링을 적용해야 합니다.

try:
    my_list = []
    print(my_list[0])  # IndexError 발생 가능
    text = 'abc'
    number = int(text)  # ValueError 발생 가능
except IndexError as e:
    print(f'인덱스 오류 발생: {e}')
except ValueError as e:
    print(f'값 오류 발생: {e}')
except Exception as e:
    print(f'예기치 않은 오류 발생: {e}')

결론

Python의 에러는 발생 원인을 정확히 이해하고 올바른 예외 처리를 적용하면 보다 안정적인 프로그램을 만들 수 있습니다. 특히 실무에서는 에러 메시지를 로깅하고, 적절한 예외 처리를 적용하는 것이 중요합니다. 위에서 다룬 오류 유형과 해결 방법을 숙지하고, 더욱 견고한 코드를 작성해보세요!

코멘트

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다