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

Python에서 사용자 정의 예외(Custom Exception) 구현하는 방법

Python 사용자 정의 예외란?

Python에서는 기본 제공 예외 클래스만으로 모든 상황을 처리하기 어려울 때가 있습니다. 이럴 때 사용자 정의 예외(Custom Exception)를 직접 만들면 프로그램의 특정 오류 상황을 더 명확하게 표현할 수 있습니다.

사용자 정의 예외를 만드는 방법은 간단합니다. 내장 Exception 클래스를 상속받는 새로운 예외 클래스를 정의하면 됩니다. 실제로 대부분의 내장 예외들도 같은 방식으로 구현되어 있습니다.

사용자 정의 예외의 기본 구조

아래 코드에서는 Exception 클래스를 부모로 하는 CustomException이라는 사용자 정의 예외 클래스를 생성했습니다. 이렇게 만든 예외 클래스는 다른 일반 예외와 동일하게 raise 문을 통해 발생시킬 수 있으며, 필요에 따라 선택적인 오류 메시지를 함께 전달할 수도 있습니다.

예제: 알파벳 맞추기 게임

다음 예제는 사용자 정의 예외를 발생시키고 이를 처리하는 과정을 보여줍니다. 프로그램은 사용자가 저장된 알파벳을 입력할 때까지 반복해서 입력을 요청하며, 틀린 경우 힌트를 제공해 정답을 찾도록 돕습니다.

# Python 사용자 정의 예외
class CustomException(Exception):
    """다른 예외들의 기본 클래스"""
    pass

class PrecedingLetterError(CustomException):
    """입력한 알파벳이 실제 값보다 앞선 경우 발생"""
    pass

class SucceedingLetterError(CustomException):
    """입력한 알파벳이 실제 값보다 뒤인 경우 발생"""
    pass

# 정답 알파벳을 맞힐 때까지 반복
alphabet = 'k'
while True:
    try:
        foo = input("알파벳을 입력하세요: ")
        if foo < alphabet:
            raise PrecedingLetterError
        elif foo > alphabet:
            raise SucceedingLetterError
        break
    except PrecedingLetterError:
        print("입력한 알파벳이 정답보다 앞선 글자입니다. 다시 시도하세요!")
        print('')
    except SucceedingLetterError:
        print("입력한 알파벳이 정답보다 뒤인 글자입니다. 다시 시도하세요!")
        print('')

print("축하합니다! 정답을 맞히셨습니다.")

코드 설명

  • CustomException: 모든 사용자 정의 예외의 공통 기본 클래스 역할을 합니다.
  • PrecedingLetterError: 입력한 알파벳이 정답보다 사전순으로 앞설 때 발생합니다.
  • SucceedingLetterError: 입력한 알파벳이 정답보다 사전순으로 뒤일 때 발생합니다.

while 루프 안의 try-except 블록은 사용자가 올바른 알파벳 'k'를 입력할 때까지 계속 반복됩니다. 잘못된 입력이 들어오면 해당하는 예외가 발생하고, except 블록에서 적절한 힌트 메시지를 출력한 후 다시 입력을 받습니다.

마무리

참고로 원본 예제는 Python 2의 raw_input() 함수를 사용했지만, 위 코드는 Python 3 환경에서 바로 실행할 수 있도록 input()으로 수정했습니다. 이처럼 사용자 정의 예외를 활용하면 오류의 의미를 명확하게 전달할 수 있고, 상황별로 서로 다른 처리 로직을 깔끔하게 분리하여 유지보수성 높은 코드를 작성할 수 있습니다.