티스토리 뷰
지금까지 우리는 이미 정의되어 있는 에러에 대한 예외처리를 해보았습니다. 그런데 파이썬에서는 필요에 따라 사용자가 새롭게 에러를 정의하고 그에 대한 예외처리를 할 수도 있는데요. 앞에서 만든 한 자리 숫자 나누기 전용 계산기 프로그램에서 실수로 두 자리 이상의 수를 입력했을 때 사용자가 입력한 값 중 어떤 값이 잘못되었는지를 보다 자세히 알려주도록 코드를 수정해보겠습니다.
먼저 두 자리 이상의 수를 입력해서 발생한 에러라는 의미로 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 |
'파이썬 강의 > 기본편' 카테고리의 다른 글
[파이썬 기본편] 10-5.퀴즈 #9 (6) | 2021.03.22 |
---|---|
[파이썬 기본편] 10-4.finally (0) | 2021.03.21 |
[파이썬 기본편] 10-2.에러 발생시키기 (0) | 2021.03.19 |
[파이썬 기본편] 10-1.예외처리 (0) | 2021.03.18 |
[파이썬 기본편] 9-12.퀴즈 #8 (1) | 2021.03.17 |
- Total
- Today
- Yesterday
- 코랩
- Xcode
- Mac
- pycharm
- 챗GPT
- pygame
- 환경설정
- vscode
- ChatGPT
- Colab
- 아나콘다
- Coding
- Unity
- 행맨
- c언어
- GUI
- Visual Studio Code
- coloso
- Tkinter
- 비주얼 스튜디오 코드
- repl.it
- game
- 파이썬
- 주피터노트북
- 나도코딩
- 파이게임
- onlineclass
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |