[카테고리:] 미분류

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