작성
·
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__
메서드를 오버라이드(재정의)하여 사용합니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.