인프런 커뮤니티 질문&답변

y Hong님의 프로필 이미지
y Hong

작성한 질문수

파이썬 무료 강의 (기본편) - 6시간 뒤면 나도 개발자

사용자 정의 예외처리 중 질문

작성

·

103

0


class BignumberError(Exception):
    def __init__(self, msg):
        self.msg = msg
    def __str__(self):
        return self.msg

try:
    print("한자리수 전용 계산기 입니다.")
    num1 = int(input("숫자를 입력하세요 : "))
    num2 = int(input("숫자를 입력하세요 : "))
    num3 = int(num1/num2)
    print("{0} / {1} = {2}".format(num1, num2, num3))
    if num1 >=10 or num2 >= 10:
        raise BignumberError("입력값 :{0}, {1}".format(num1, num2))
except ValueError :
    print("오류! 한자리 숫자만 입력하세요")
except BignumberError as err :
    print("빅넘버에러 발생!")
    print(err)

    def __str__(self):
        return self.msg

위 코드 전문에서 제가 밑에 따로 적어둔 부분을 빼먹고 코드 작성을 했는데도

BignumberError 발생 하고 입력값을 알려주는 메시지가 정상적으로 표시가 되었습니다.

강의에서는 raise BignumberError("입력값 :{0}, {1}".format(num1, num2)) 이부분을 self.msg에 리턴해서 가지고 있다가 마지막 프린트문에서 출력이 된다고 했는데

리턴문이 없어도 잘 실행이 되는 이유는 뭘까요?

답변 1

0

안녕하세요, 인프런 AI 인턴입니다.

y Hong님의 질문에 대한 답변으로, 이해가 가지 않는 부분은 __str__ 메서드를 빼먹었음에도 BignumberError 발생 시, 입력값을 알려주는 메시지가 정상적으로 출력되는 원리에 관한 것입니다.

Python에서 Exception 클래스는 사용자가 정의한 예외 처리 클래스에서 상속받아 사용할 수 있습니다. 사용자 정의 예외 클래스에서 __str__ 메서드를 구현하지 않아도, Exception 클래스 내부에 이미 __str__ 메서드가 구현되어 있어, 예외 메시지를 출력할 수 있습니다. 즉, __str__ 메서드는 예외가 발생했을 때 문자열로 변환(return)해서 출력해주는 역할을 담당합니다.

질문하신 내용과 유사한 상황에 대한 설명은 강의 중 “사용자 정의 예외처리” 관련 질문에서도 찾아볼 수 있습니다. 해당 내용은 나도코딩님께서 답변하신 부분에서도 언급되었으며, 사용자 정의 예외 클래스가 Exception을 상속받으면, Exception__str__ 구현을 통해 에러 메시지가 출력될 수 있다는 것을 내포하고 있습니다.

아래의 질문&답변은 y Hong님의 질문과는 직접적인 관련은 없지만, Exception 클래스 상속과 관련된 이해를 돕기 위해 참고할 수 있는 내용입니다:
- class BigNumberError와 관련하여
- 사용자지정 예외 클래스 정의 구문의 상세 의미 질문

직접적으로 __str__을 구현하지 않았음에도 메시지가 정상적으로 출력되는 이유는 Exception 클래스 내부에 이미 에러 메시지를 문자열로 변환하는 기본적인 메커니즘이 구현되어 있기 때문입니다. 특별한 형태의 에러 메시지를 원할 때에만 사용자 정의 예외 클래스에서 __str__ 메서드를 오버라이드(재정의)하여 사용합니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

y Hong님의 프로필 이미지
y Hong

작성한 질문수

질문하기