본문 바로가기

개발이야기/Python

Python 커스텀 익셉션 만들기

728x90

python에는 수행 중 발생되는 예외를 처리하기 위해 아래 내장 익셉션 클래스들을 지원합니다.

대표적으로 많이 사용되는 익셉션 클래스는 아래와 같습니다.

 

Exception : 모든 예외의 기본 클래스, 모든 예외는 해당 클래스를 상속 받습니다.

KeyError : 사전 객체에 없는 키를 참조하려할때 발생합니다.

TypeError : 잘못된 타입을 다루려고 할때 발생합니다.

IndexError : 리스트, 집합, 문자열 등에서 시퀀스 인덱스가 범위를 벗어났을때 발생합니다.

ValueError : 다루는 값이 부적절한 값일때 발생합니다.

ZeroDivisionError : 어떤 값을 0으로 나눌때 발생합니다.

 

위에 모든 익셉션들은 아래와 같이 예외를 처리할때 사용됩니다.

try:
    # 입력 받기
    num1 = float(input("첫 번째 숫자를 입력하세요: "))
    num2 = float(input("두 번째 숫자를 입력하세요: "))

    # 숫자 나누기
    result = num1 / num2

except ValueError:
    # 숫자가 아닌 값을 입력받았을 때
    print("유효한 숫자를 입력해야 합니다.")

except ZeroDivisionError:
    # 0으로 나누기를 시도했을 때
    print("0으로 나눌 수 없습니다.")

else:
    # 예외가 발생하지 않았을 때 실행
    print(f"결과: {result}")

finally:
    # 무조건 실행
    print("프로그램을 종료합니다.")

 

하지만, 어떤 특정 상황에서는 유지보수나 가독성을 높이기 위해서 원하는 고유한 익셉션을 정의하고 이를 사용하고 싶은 때가 있습니다.

아래는 커스텀 익셉션을 정의하는 방법 입니다.

class NegativeValueError(ValueError):

    def __init__(self, message="Input value is negative"):
        self.message = message
        super().__init__(self.message)

먼저 정의하고자 하는 예외의 클래스 이름을 지정하고 Exception 이나 다른 내장 익셉션 클래스를 상속 받습니다.

여기선 데이터가 음수인 경우 에러를 반환하도록 하고 있습니다.

 

생성자 init 함수를 생성하고 message를 변수를 받도록 설정합니다.

그리고 기본 메시지를 설정했습니다.

 

super함수를 통해 상속 받은 클래스의 생성자 함수를 실행하고 이때 메시지 변수를 같이 넘겨줍니다.

 

아래는 사용 방법 입니다.

def validate_value(value):
	if value < 0:
    	raise NegativeValueError
    return value

def __name__ == '__main__':

    value = -1

    try:
        print(validate_value(value))
    except NegativeValueError as e:
        print(e)

 

validate_value에서 value가 음수인 경우 NegativeValueError를 발생시키도록 설정했습니다.

실행 시 try ~ except 구문을 사용해 생성한 커스텀 익셉션을 정의해 해당 예외를 처리하도록 했습니다.