-
TIL.38 예외 발생시키기 및 만들기TIL 2020. 11. 15. 16:37728x90
## 예외 발생시키기 및 만들기
# 이전까지는 파이썬에서 정해진 예외만 처리하으면 이번에는 직접 예외를 발생시켜 보자.
## 예외를 발생시킬 때는 raise에 예외를 지정하고 에러 메시지를 넣는다(에러 메시지는 생략 할 수 있음)
# raise 예외('에러메시지')
try: x = int(input('3의 배수를 입력하세요: ')) if x % 3 != 0: # x가 3의 배수가 아니면 raise Exception('3의 배수가 아닙니다.') # 예외를 발생시킴 print(x) except Exception as e: # 예외가 발생했을 때 실행됨 print('예외가 발생했습니다.', e) # raise 의 에러메시지가 e에 들어간다. # 3의 배수를 입력하세요: 5 # 예외가 발생했습니다. 3의 배수가 아닙니다.
## raise의 처리 과정
# 다음은 함수 안에서 raise를 사용하지만 함수 안에는 try except가 없는 상태이다.
def three_multiple(): x = int(input('3의 배수를 입력하세요: ')) if x % 3 != 0: # x가 3의 배수가 아니면 raise Exception('3의 배수가 아닙니다.') # 예외를 발생시킴 print(x) # 현재 함수 안에는 except가 없으므로 # 예외를 상위 코드 블록으로 넘김 try: three_multiple() except Exception as e: # 하위 코드 블록에서 예외가 발생해도 실행됨(함수바깥에 except가 있는 상태) print('예외가 발생했습니다.', e) # 3의 배수를 입력하세요: 100 # 예외가 발생했습니다. 3의 배수가 아닙니다.
## three_multiple 함수는 안에 try except가 없는 상태에서 raise로 예외를 발생
## 이렇게 되면 함수 바깥에 있는 except에서 예외가 처리된다.
## 즉, 예외가 발생하더라도
현재 코드 블럭에서 처리해줄 except가 없다면 except가 나올때까지 예외를 계속 상위 코드 블럭으로 넘기게 된다.
## 만약 함수 바깥에도 처리해줄 except가 없다면 코드 실행은 중지되고 에러가 표시된다.
three_multiple() 3의 배수를 입력하세요: 5 (입력) Traceback (most recent call last): File "<pyshell#5>", line 1, in <module> three_multiple() File "C:\project\try_except_function_raise.py", line 4, in three_multiple raise Exception('3의 배수가 아닙니다.') # 예외를 발생시킴 Exception: 3의 배수가 아닙니다. # 직접 three_multiple 함수를 호출했으므로 except가 없는 상태이다.
## 현재 예외를 다시 발생시키기
## try except에서 처리한 예외를 다시 발생시키는 방법으로
except 안에서 raise를 사용하면 현재 예외를 다시 발생시킨다.(re-raise)
# raise
def three_multiple(): try: x = int(input('3의 배수를 입력하세요: ')) if x % 3 != 0: # x가 3의 배수가 아니면 raise Exception('3의 배수가 아닙니다.') # 예외를 발생시킴 print(x) except Exception as e: # 함수 안에서 예외를 처리함 print('three_multiple 함수에서 예외가 발생했습니다.', e) raise # raise로 현재 예외를 다시 발생시켜서 상위 코드 블록으로 넘김 try: three_multiple() except Exception as e: # 하위 코드 블록에서 예외가 발생해도 실행됨 print('스크립트 파일에서 예외가 발생했습니다.', e)
## three_multiple 함수 안에서 발생한 예외를 함수 안의 except에서 한 번 처리하고,
## raise로 예외를 다시 발생시켜서 상위 코드 블록으로 넘겼다.
## 그 다음에 함수 바깥의 except에서 예외를 처리했다. 이런 방식으로 같은 예외를 계속 처리해줄 수 있다.
## 참고
## raise만 사용하면 같은 예외를 상위 코드 블록으로 넘기지만
raise에 다른 예외를 지정하고 에러 메시지를 넣을 수도 있다.
# raise 예외('에러메시지')
if x % 3 != 0: raise Exception('3의 배수가 아닙니다.') print(x) except Exception as e: print('three_multiple 함수에서 예외가 발생했습니다.', e) raise RuntimeError('three_multiple 함수에서 예외가 발생했습니다.') ## 참고
## assert로 예외 발생시키기
## 이번에는 프로그래머(사용자)가 직접 예외를 만들어보자(발생시키는것과 다르다.)
#프로그래머가 직접 만든 예외를 "사용자 정의 예외"라고 한다.
## 예외를 만드는 방법은 Exception을 상속받아서 새로운 클래스를 만들면 된다.
## 그리고 __init__ 메서드에서 기반 클래스의 __init__ 메서드를 호출하면서 에러 메시지를 넣어주면 된다.
# class 예외이름(Exception):
# def __init__(self):
# super().__init__('에러메시지')
class NotThreeMultipleError(Exception): # Exception을 상속받아서 새로운 예외를 만듦 def __init__(self): super().__init__('3의 배수가 아닙니다.') #suoer를 이용해 기반클래스의 __init__메서드를 호출하면서 에러메시지를 넣어줌 def three_multiple(): try: x = int(input('3의 배수를 입력하세요: ')) if x % 3 != 0: # x가 3의 배수가 아니면 raise NotThreeMultipleError # NotThreeMultipleError 예외를 발생시킴 print(x) # 3의 배수면 바로 프린트 except Exception as e: print('예외가 발생했습니다.', e) three_multiple() # 3의 배수를 입력하세요: 5 # 예외가 발생했습니다. 3의 배수가 아닙니다.
## 아래와 같이 Exception만 상속받고 pass를 넣어서 아무것도 구현하지 않아도 된다.
## 대신 이때는 예외를 발생시킬때 에러메시지를 넣어줘야 한다.
class NotThreeMultipleError(Exception): # Exception만 상속받고 pass # 아무것도 구현하지 않음
def three_multiple(): try: x = int(input('3의 배수를 입력하세요: ')) if x % 3 != 0: # x가 3의 배수가 아니면 raise NotThreeMultipleError('3의 배수가 아닙니다.') # 예외를 발생시킬 때 에러 메시지를 넣음 print(x) # 3의 배수면 바로 프린트 except Exception as e: print('예외가 발생했습니다.', e) three_multiple() # 3의 배수를 입력하세요: 5 # 예외가 발생했습니다. 3의 배수가 아닙니다.
728x90'TIL' 카테고리의 다른 글
TIL.40 CSS 알아보기(wecode_2일차) (0) 2020.11.17 TIL.39 HTML.CSS 알아보기(wecode_1일차) (0) 2020.11.16 TIL.37 예외처리하기(try, except) (0) 2020.11.14 TIL.36 selenium을 이용한 이미지 크롤링 자동화 (2) 2020.11.13 TIL.35 두점 사이의 거리 구하기 (0) 2020.11.12