예외처리
예외(exception)란?
- 코드를 실행하는 중에 발생한 에러
ex)
def ten_div(n): return 10/n print(ten_div(0)) --출력-- ZeroDivisionError: division by zero
10을 0으로 나누면 무한루프에 빠지기때문에 오류를 출력
try except 사용
구조)
try: 실행할 코드 except: 예외가 발생했을때 실행할 코드
예외가 발생하면 except로 내려가서 코드를 실행
위 코드를 try except를 이용해 수정
fix)
try: n = int(input('숫자를 입력하세요>>')) y = 10/n print(y) except: print('예외가 발생했습니다') --입출력-- 숫자를 입력하세요>>0 예외가 발생했습니다
에러 메시지 받아오기
구조)
try: 실행할 코드 except 예외 as 변수: 예외가 발생했을때 실행하는 코드
ex)
y = [10,20,30] try: index, n = map(int,input('인덱스와 나눌 숫자를 입력>> ').split()) print(y[index]/n) except ZeroDivisionError as e: print('숫자를 0으로 나눌수 없습니다',e) except IndexError as e: print('잘못된 인덱스입니다', e) --입출력-- 인덱스와 나눌 숫자를 입력>>2 0 숫자를 0으로 나눌수 없습니다 division by zero 인덱스와 나눌 숫자를 입력>>10 2 잘못된 인덱스입니다 list index out of range
else와 finally 사용
구조)
try: 실행할 코드 except : 예외가 발생했을때 실행하는 코드 else: 예외가 발생하지 않았을대 실행할 코드 finally: 예외 발생 여부와 상관없이 항상 실행할 코드
ex)
try: n = int(input('숫자를 입력하세요>>')) y = 10/n except ZeroDivisionError as e: print('숫자를 0으로 나눌수 없습니다',e) else: print(y) finally: print("코드 실행이 끝났습니다") --입출력-- 숫자를 입력하세요>>2 5.0 코드 실행이 끝났습니다 숫자를 입력하세요>>0 숫자를 0으로 나눌수 없습니다 division by zero 코드 실행이 끝났습니다
#참고사항#
- try는 함수가 아니므로 스택 프레임을 만들지 않음 #잘모르겠다#
- try, except, else, finally 안에서 변수를 만들더라도 바깥에서 사용 가능
예외 발생시키기
구조)
raise 예외(‘에러메시지’)
ex)
try: n = int(input('3의 배수 입력>>')) if n%3 !=0: raise Exception('3의 배수가 아닙니다') print(n) except Exception as e: print('예외가 발생했습니다', e) --입출력-- 3의 배수 입력>>3 3 3의 배수 입력>>8 예외가 발생했습니다 3의 배수가 아닙니다
8은 3의 배수가 아니므로 raise Exception로 예외가 발생
Exception의 예외메시지는 Exception as e의 e변수로 들어감
raise로 예외를 발생시키면 raise아래의 코드는 실행하지 않음
#참고 - assert로 예외 발생시키기#
구조)
assert 조건식 assert 조건식, 에러메시지
ex)
n = int(input('3의 배수 입력>>')) assert n%3 == 0,'3의 배수가 아닙니다' print(n) --입출력-- 3의 배수 입력>>5 assert n%3 == 0,'3의 배수가 아닙니다' AssertionError: 3의 배수가 아닙니다
assert는 조건식이 거짓일 때 AssertionError 예외를 발생시키며 조건식이 참이면 그냥 넘어감
보통 assert는 나와서는 안 되는 조건을 검사할 때 사용
'Emotion > 파이썬' 카테고리의 다른 글
모듈과 패키지 (0) | 2020.09.07 |
---|---|
클래스_2 (0) | 2020.09.02 |
클래스_1 (0) | 2020.09.01 |
함수_2 (0) | 2020.08.26 |
파이썬 함수_1 (0) | 2020.07.08 |