오류 예외 처리 기법
try:
x = int(input('나눌 숫자를 입력하세요: '))
y = 10 / x
print(y)
except: # 예외가 발생했을 때 실행됨
print('예외가 발생했습니다.')
except[발생오류 [as 오류 메시지 변수]] : 특정 예외만 처리하기
try:
4/0
except ZeroDivisionError as e:
print(e)
f = open('foo.txt','w')
try:
# 무언가를 수행
finally :
f.close()
try:
# ~~
except ~~ :
print()
except ~~ :
print()
try:
f = open("나",'r')
except FileNotFoundError:
pass
try 문 안에서 FileNotFoundError가 발생할 경우 pass를 사용하여 오류를 회피하도록 작성한 예제
a = int(input("1~5 까지 숫자 입력 : "))
# 범위를 벗어나면 error 발생!
if a < 1 or a > 5:
raise
# 범위 안에 있으면 정상 출력
print(f"입력한 a : {a} 입니다.")
try:
a = int(input("1~5 까지 숫자 입력 : "))
# 범위를 벗어나면 error 발생!
if a < 1 or a > 5:
raise
# 범위 안에 있으면 정상 출력
print(f"입력한 a : {a} 입니다.")
except:
print("1~5 사이 입력하라고 했잖아요.")
-동일한 코드를 try + except 구문으로 감싸게 하고 try 안에서 raise 를 통해서 에러를 발생시킬 수 있습니다.
하지만 try + except 로 예외처리를 하고 있으니, 에러로 인해서 프로그램이 중간에 비정상 종료되는 것이 아니라,
except 구문으로 가게되어서 예외처리 되고 있음을 볼 수 있습니다.
class MyError (Exception):
pass
- 그냥 Exception을 상속받아서 새로운 클래스를 만들면 됩니다. 그리고 init 메서드에서 기반 클래스의 init 메서드를 호출하면서 에러 메시지를 넣어주면 됩니다.
def say_nick(nick):
if nick == "바보":
raise MyError()
print(nick)
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("에러가 발생하였습니다. 한 자리 숫자만 입력하세요.")
class BigNumberError(Exception): # 사용자 정의 에러
def __init__(self, msg):
self.msg = msg
def __str__(self):
return self.msg
-이렇게만 해서는 ValueError 와 큰 차이가 없으므로 이번에는 BigNumberError 의 내용을 채워보겠습니다.
class BigNumberError(Exception):
def __init__(self, msg):
self.msg = msg
def __str__(self):
return "[에러코드 001] " + self.msg # 에러 메시지 가공