728x90
반응형
SMALL
■ 예외사항
# 실행 중에 발생한 오류
def divide(x, y):
return x/y
divide(10, 2)
divide(10, 3)
divide(10, 0) # 예상이름: 예상메세지 / ZeroDivisionError: division by zero
divide(10, "2") # 신텍스에러 = SyntaxError: invalid syntax. Perhaps you forgot a comma?
divide(10, "2") # 타입에러 = TypeError: unsupported operand type(s) for /: 'int' and 'str'
# try-except
try:
print(divide(10, 2)) # 실행중인 being절
except: # 정상적인 종료
print("오류가 발생했습니다.")
# 계산 에러
try:
print(divide(10, 0)) # 실행중인 being절
except: # 정상적인 종료
print("오류가 발생했습니다.")
# 타입에러
try:
print(divide(10, "0")) # 실행중인 being절
except: # 정상적인 종료
print("오류가 발생했습니다.")
# PL/SQL : when 에러명 then sql쿼리문
try:
print(divide(10, 0)) # 실행중인 being절
except ZeroDivisionError as err:
print("0값으로 나눌 수 없습니다.", err)
except TypeError as err:
print("인수 값을 숫자로 입력해 주세요", err)
# 에러명 별칭 가능, 에러메세지 출력 가능
try:
print(divide(10, "0")) # 실행중인 being절
except ZeroDivisionError as err:
print("0값으로 나눌 수 없습니다.", err)
except TypeError as err:
print("인수 값을 숫자로 입력해 주세요", err)
# 실행 중 다른 오류를 출력하고 싶을 경우
try:
print(divide(10, 2)) # 실행중인 being절
except ZeroDivisionError as err:
print("0값으로 나눌 수 없습니다.", err)
except TypeError as err:
print("인수 값을 숫자로 입력해 주세요", err)
except:
print('오류가 발생했습니다.')
# try 절에 변수 처리 했을 경우
try:
z = divide(10, 2)
except ZeroDivisionError as err:
print("0값으로 나눌 수 없습니다.", err)
except TypeError as err:
print("인수 값을 숫자로 입력해 주세요", err)
except:
print('오류가 발생했습니다.')
else: # 문법적으로 except 절 뒤에 작성, 오류가 나지 않았을 때 실행되는 수행되는 절
print("결과 : ", z)
# finally 절 = 오류와 상관없이 마지막에 실행
try:
z = divide(10, 2)
except ZeroDivisionError as err: # ZeroDivisionError: 오류명
print("0값으로 나눌 수 없습니다.", err)
except TypeError as err:
print("인수 값을 숫자로 입력해 주세요", err)
except:
print('오류가 발생했습니다.')
else: # 문법적으로 except 절 뒤에 작성
print("결과 : ", z)
finally:
print("프로그램 종료")
# PL/SQL 예외처리 : raise문
# 사용자가 정의한 예외 사항
def fun(arg):
try:
if arg < 1 or arg > 10:
raise Exception
else:
print('입력한 수는 {} 입니다.'.format(arg))
except Exception:
print('오류가 발생했습니다.')
fun(0)
fun(5)
fun(20)
# 오류메시지 출력
def fun(arg):
try:
if arg < 1 or arg > 10:
raise Exception("유효하지 않은 숫자입니다. {}".format(arg))
else:
print('입력한 수는 {} 입니다.'.format(arg))
except Exception as error:
print('오류가 발생했습니다.', error)
fun(0)
fun(5)
fun(20)
# 연습
def positive_divide(x,y):
try:
if y < 0:
raise Exception('오류 - 음수로 나눌 수 없습니다. {}'.format(y))
return x/y
except TypeError as error:
print('인수값을 숫자로 입력해 주세요.', error)
except ZeroDivisionError as error:
print('0으로 나눌 수 없습니다.', error)
except Exception as error:
print(error)
positive_divide(10, 2)
positive_divide(10, -2)
예외 사항 이름을 생성하는 방법
# 예외 class 생성
class NegativeDivisionError(Exception): # Exception을 상속 받기
def __init__(self, value):
self.value = value
def positive_divide(x,y):
if y < 0:
raise NegativeDivisionError(y)
return x / y
positive_divide(10, 2)
positive_divide(10, -2)
class NegativeDivisionError(Exception): # Exception을 상속 받기
pass # 문법적으로 문장이 필요할 뿐, 아무것도 하지 않는 구문
def positive_divide(x,y):
if y < 0:
raise NegativeDivisionError(y)
return x / y
positive_divide(10, 2)
positive_divide(10, -2)
# raise 문에 값을 무조건적으로 삽입X
class NegativeDivisionError(Exception): # Exception을 상속 받기
pass # 오류가 나와도 pass
def positive_divide(x,y):
if y < 0:
raise NegativeDivisionError()
return x / y
positive_divide(10, 2)
positive_divide(10, -2)
예외사항 이름의 해당하는 오류 메세지 생성
# PL/SQL => package(), package body() 선언 및 생성
class NegativeDivisionError(Exception): # Exception을 상속 받기
def __init__(self):
# exception 상속받기
super().__init__('음수로 나눌 수 없습니다.')
def positive_divide(x,y):
if y < 0:
raise NegativeDivisionError()
return x / y
positive_divide(10, 2)
positive_divide(10, -2)
# __str__ 활용(스페셜 메소드)
class test:
def __str__(self):
return "오늘 하루도 열심히 공부하자!"
t = test()
print(t)
t.__str__()
print(test())
# super() 대신에 __str__ 예외처리 활용
class NegativeDivisionError(Exception): # Exception을 상속 받기
def __str__(self):
return '음수로 나눌 수 없습니다.'
def positive_divide(x,y):
if y < 0:
raise NegativeDivisionError()
return x / y
positive_divide(10, 2)
positive_divide(10, -2)
# error 오류번호 생성
class NegativeDivisionError(Exception): # Exception을 상속 받기
def __str__(self):
return 'error-2000, 음수로 나눌 수 없습니다.'
def positive_divide(x,y):
if y < 0:
raise NegativeDivisionError()
return x / y
positive_divide(10, 2)
positive_divide(10, -2)
728x90
반응형
LIST