Python에서는 Exception 클래스를 상속받아 자신만의 사용자 정의 예외(Custom Exception)를 만들 수 있습니다. 이렇게 정의한 예외에는 문자열 등 다양한 객체를 함께 전달할 수 있어, 오류가 발생했을 때 더 구체적인 정보를 제공하는 데 유용합니다.
이 글에서는 문자열 객체를 사용자 정의 예외에 전달하는 방법을 예제 코드와 실행 결과를 통해 살펴보겠습니다.
사용자 정의 예외 정의하기
아래 코드는 Exception의 하위 클래스인 FooException을 정의하고, 조건에 맞지 않는 입력값을 예외 객체로 전달하는 예제입니다.
#foobar.py
class FooException(Exception):
def __init__(self, text, *args):
super(FooException, self).__init__(text, *args)
self.text = text
try:
bar = input("Enter a string:")
if not isinstance(bar, str):
raise FooException(bar)
except FooException as r:
print('there is an error')
else:
print(type(bar))
print(bar)
코드 동작 방식
FooException은Exception을 상속하며, 생성자에서 문자열text와 가변 인수(*args)를 받습니다.super().__init__()을 호출해 부모 클래스의 초기화 과정을 수행한 후, 전달받은 문자열을self.text속성에 저장합니다.try블록에서 사용자 입력을 받고, 입력값이 문자열이 아니면raise FooException(bar)를 통해 입력값을 예외 객체에 담아 발생시킵니다.- 예외가 발생하면
except블록이 오류 메시지를 출력하고, 발생하지 않으면else블록이 입력값의 타입과 내용을 출력합니다.
참고: 원본 예제는 Python 2 기반으로 작성되어
basestring을 사용했지만, 위 코드는 Python 3 환경에 맞게str로 수정한 버전입니다.
실행 및 출력 결과
터미널에서 다음과 같이 스크립트를 실행합니다.
$ python foobar.py
문자열을 입력하면 다음과 같은 결과가 출력됩니다.
"C:/Users/TutorialsPoint1/~foobar.py"
Enter a string:'voila'
<type 'str'>
voila
입력된 값이 문자열이므로 예외는 발생하지 않으며, else 블록이 실행되어 입력값의 타입(str)과 내용이 그대로 출력됩니다. 반대로 숫자처럼 문자열이 아닌 값이 입력되면 FooException이 발생하고 'there is an error' 메시지가 출력됩니다.
정리
사용자 정의 예외에 객체를 전달하는 핵심은 생성자(__init__)에서 필요한 데이터를 받아 인스턴스 속성으로 저장하는 것입니다. 이렇게 하면 except 블록에서 예외 객체를 통해 오류와 관련된 추가 정보를 손쉽게 확인할 수 있어, 보다 명확하고 체계적인 예외 처리가 가능합니다.