티스토리 뷰

지금까지 우리는 이미 정의되어 있는 에러에 대한 예외처리를 해보았습니다. 그런데 파이썬에서는 필요에 따라 사용자가 새롭게 에러를 정의하고 그에 대한 예외처리를 할 수도 있는데요. 앞에서 만든 한 자리 숫자 나누기 전용 계산기 프로그램에서 실수로 두 자리 이상의 수를 입력했을 때 사용자가 입력한 값 중 어떤 값이 잘못되었는지를 보다 자세히 알려주도록 코드를 수정해보겠습니다.

 

먼저 두 자리 이상의 수를 입력해서 발생한 에러라는 의미로 BigNumberError 라는 클래스를 만들고 파이썬에서 이미 정의되어 있는 Exception 이라는 클래스를 상속받도록 합니다. 이렇게 하면 앞에서 봤던 ValueError, IndexError 와 비슷하게 사용자가 필요로 하는 어떤 새로운 형태의 Error 를 정의할 수 있습니다. 클래스의 내용은 일단은 pass 로 두겠습니다.

 

그리고 입력값이 10 이상인지를 확인하는 if 구문에서 ValueError 대신 새롭게 정의한 BigNumberError 를 발생시키고, except 구문을 추가함으로써 새로운 에러에 대한 예외 처리를 하도록 하겠습니다.

class BigNumberError(Exception): # 사용자 정의 에러
    pass

try:
    print("한 자리 숫자 나누기 전용 계산기입니다.")
    num1 = int(input("첫 번째 숫자를 입력하세요: "))
    num2 = int(input("두 번째 숫자를 입력하세요: "))
    if num1 >= 10 or num2 >= 10: # 입력받은 수가 한 자리인지 확인
        # raise ValueError
        raise BigNumberError # 사용자 정의 에러
    print("{0} / {1} = {2}".format(num1, num2, int(num1 / num2)))
except ValueError:
    print("잘못된 값을 입력하였습니다. 한 자리 숫자만 입력하세요.")
except BigNumberError: # 사용자 정의 예외 처리
    print("에러가 발생하였습니다. 한 자리 숫자만 입력하세요.")

 

프로그램을 실행하고 10 과 5 를 순차적으로 입력해보니 BigNumberError 가 발생했고 이에 대한 예외처리가 되어서 마지막에 추가한 문장이 잘 출력되는 것을 확인할 수 있습니다.

한 자리 숫자 나누기 전용 계산기입니다.
첫 번째 숫자를 입력하세요: 10
두 번째 숫자를 입력하세요: 5
에러가 발생하였습니다. 한 자리 숫자만 입력하세요.

 

이렇게만 해서는 ValueError 와 큰 차이가 없으므로 이번에는 BigNumberError 의 내용을 채워보겠습니다.

pass 부분 대신 __init__() 생성자와 __str__() 메소드를 추가합니다. 생성자에서는 에러 메시지를 의미하는 msg 를 전달받아서 멤버변수로 설정하고, __str__() 메소드에서는 멤버변수 msg 를 반환해주도록 합니다. 이제 BigNumberError 를 발생시킬 때 필요한 문구를 추가하여 보다 자세한 에러 내용을 출력할 수 있습니다.

class BigNumberError(Exception): # 사용자 정의 에러
    def __init__(self, msg):
        self.msg = msg

    def __str__(self):
        return self.msg

 

try 구문 내에서는 BigNumberError 를 발생시키는 부분의 코드를 보완하여 에러가 발생하는 시점에 어떤 값들이 입력되었는지를 문자열 형태로 작성합니다. 이 내용이 바로 __init__() 생성자의 msg 로 들어가게 되는 것이죠. 그리고 except 구문에서는 as 를 이용하여 err 이라는 이름으로 에러를 받고 이를 print() 를 통해 출력하면 __str__() 메소드에 의해 반환되는 msg 멤버변수가 출력이 됩니다.

try:
    print("한 자리 숫자 나누기 전용 계산기입니다.")
    num1 = int(input("첫 번째 숫자를 입력하세요: "))
    num2 = int(input("두 번째 숫자를 입력하세요: "))
    if num1 >= 10 or num2 >= 10: # 입력받은 수가 한 자리인지 확인
        raise BigNumberError("입력값 : {0}, {1}".format(num1, num2)) # 자세한 에러 메시지
    print("{0} / {1} = {2}".format(num1, num2, int(num1 / num2)))
except ValueError:
    print("잘못된 값을 입력하였습니다. 한 자리 숫자만 입력하세요.")
except BigNumberError as err:
    print("에러가 발생하였습니다. 한 자리 숫자만 입력하세요.")
    print(err) # 에러 메시지 출력

 

프로그램을 실행하고 10 과 5 를 순차적으로 입력하면 이번에는 에러내용과 함께 사용자가 어떤 값을 입력했는지도 함께 출력해줍니다.

한 자리 숫자 나누기 전용 계산기입니다.
첫 번째 숫자를 입력하세요: 10
두 번째 숫자를 입력하세요: 5
에러가 발생하였습니다. 한 자리 숫자만 입력하세요.    
입력값 : 10, 5

 

사실 BigNumberError 의 __init__() 생성자와 __str__() 메소드는 따로 정의하지 않고 그냥 pass 로만 두어도 동일하게 동작합니다. 하지만 생성자에서 추가로 어떤 작업을 해야 한다거나 __str__() 메소드에서 에러 메시지를 에러 코드 등과 함께 출력하고 싶은 경우에 다음과 같이 코드를 수정할 수 있습니다.

class BigNumberError(Exception):
    def __init__(self, msg):
        self.msg = msg

    def __str__(self):
        return "[에러코드 001] " + self.msg # 에러 메시지 가공

 

변경된 코드를 실행하고 에러가 발생한 경우 예외처리 구문에서 출력되는 메시지는 다음과 같습니다.

[에러코드 001] 입력값 : 10, 5
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함