-
TIL.37 예외처리하기(try, except)TIL 2020. 11. 14. 21:30728x90
## 예외 처리 사용하기
## 예외(exception) == 코드를 실행하는 중에 발생한 에러를 뜻함
def ten (x): return 10 / x print(ten(2)) # 5.0
## 분모를 0으로 넣게 될 경우 실행 젱어가 발생하는데 이런 상황을 예외라고 한다.
print(ten(0)) Traceback (most recent call last): File "c:/Users/user/Desktop/python3_실습/38.1예외처리사용하기.py", line 9, in <module> print(ten(0)) File "c:/Users/user/Desktop/python3_실습/38.1예외처리사용하기.py", line 6, in ten return 10 / x ZeroDivisionError: division by zero
## ZeroDivisionError뿐만 아니라 지금까지 만난 AttributeError, NameError, TypeError 등
다양한 에러들도 모두가 예외이다.
## try , except 사용하기
## 이러한 예외가 발생했을 때도 스크립트 실행을 중단하지 않고 계속 실행하게 해주는 예외 처리 방법으로
try except가 있다.
# try:
# 실행할 코드
# except:
# 예외가 발생했을 때 처리하는 코드
# 숫자를 0으로 나누었을때 예외 처리
try: x = int(input('나눌 숫자를 입력하세요: ')) y = 10 / x print(y) except: # 예외가 발생했을 때 실행됨 print('예외가 발생했습니다.') # 나눌 숫자를 입력하세요: 0 (입력) # 예외가 발생했습니다.
## 위에서는 숫자를 0으로 나눌때 except 예외 처리를 해주었다.
## 특히 예외가 발생하면 해당 줄에서 코드 실행을 중단하고 바로 except로 가서 코드를 실행한다.
## 즉, try의 y = 10 / x 를 비롯하여 그 아래줄에 있는 print(y)도 실행되지 않는다.
## try 의 코드가 예외 없이 잘 실행되면 except의 코드는 실행되지 않고 그냥 넘어간다.
## 특정 예외만 처리하기
## except에 예외 이름을 지정해서 특정 예외가 발생했을 때만 처리 코드를 만들 수 있다.
# try:
# 실행할 코드
# except 예외이름:
# 예외가 발생했을 때 처리하는 코드
y = [10, 20, 30] try: index, x = map(int, input('인덱스와 나눌 숫자를 입력하세요: ').split()) print(y[index] / x) except ZeroDivisionError: # 숫자를 0으로 나눠서 에러가 발생했을 때 실행됨 print('숫자를 0으로 나눌 수 없습니다.') except IndexError: # 범위를 벗어난 인덱스에 접근하여 에러가 발생했을 때 실행됨 print('잘못된 인덱스입니다.') # 인덱스와 나눌 숫자를 입력하세요: 2 0 # 숫자를 0으로 나눌 수 없습니다. # 인덱스와 나눌 숫자를 입력하세요: 3 2 # 잘못된 인덱스입니다.
## except에 예외이름을 지정하여 0으로 나누면 ZeroDivisionError:의 처리 코드가 실행되고
## 인덱스에 3을 지정하면 범위를 벗어나게 됩니다. 이때는 except IndexError:의 처리 코드가 실행된다.
## 예외의 에러 메시지 받아오기
## except 뒤에 as 변수를 지정하면 발생한 예외의 에러 메시지를 확인하여
어떠한 에러가 발생하였는지 확인 할 수 있다.
# try:
# 실행할 코드
# except 예외 as 변수:
# 예외가 발생했을 때 처리하는 코드
## 보통 변수에는 ( exception)의 e를 따서 변수 이름을 e로 작성한다.
y = [10, 20, 30] try: index, x = map(int, input('인덱스와 나눌 숫자를 입력하세요: ').split()) print(y[index] / x) except ZeroDivisionError as e: # as 뒤에 변수를 지정하면 에러를 받아옴 print('숫자를 0으로 나눌 수 없습니다.', e) # e에 저장된 에러 메시지 출력 except IndexError as e: print('잘못된 인덱스입니다.', e) # 인덱스와 나눌 숫자를 입력하세요: 2 0 # 숫자를 0으로 나눌 수 없습니다. division by zero # 인덱스와 나눌 숫자를 입력하세요: 3 2 # 잘못된 인덱스입니다. list index out of range
## 단, 예외가 여러 개 발생하더라도 먼저 발생한 예외의 처리 코드만 실행됩니다
(또는, 예외 중에서 높은 계층의 예외부터 처리된다. 기반 클래스 > 파생 클래스 순)
## 모든 예외의 에러 메시지를 출력하고 싶다면 다음과 같이
except에 Exception을 지정하고 as 뒤에 변수를 넣으면 된다.
except Exception as e: # 모든 예외의 에러 메시지를 출력할 때는 Exception을 사용 print('예외가 발생했습니다.', e)
### 이처럼 예외 처리는 에러가 발생하더라도 스크립트의 실행을 중단시키지 않고 계속 실행하고자 할 때 사용한다.
## 예외 계층
# 예외도 클래스 상속으로 구현되며 다음과 같은 계층으로 이루어져 있습니다. 보통 파이썬에서 새로운 예외를 만들 때는 Exception을 상속받아서 구현한다.
# 전체 계층도는 파이썬 공식 문서를 참조하자.
# Built-in Exceptions: https://docs.python.org/3/library/exceptions.html#exception-hierarchy
## else와 finally 사용하기
## tyr except 문에서 else 사용하기
## 예외가 발생하지 않았을 때 코드를 실행하는 else를 사용해보자
## 다음과 같이 else는 except 바로 다음에 와야 하며 except를 생략할 수 없다. (순서 및 생략 불가)
# try:
# 실행할 코드
# except:
# 예외가 발생했을 때 처리하는 코드
# else:
# 예외가 발생하지 않았을 때 실행할 코드
try: x = int(input('나눌 숫자를 입력하세요: ')) y = 10 / x except ZeroDivisionError: # 숫자를 0으로 나눠서 에러가 발생했을 때 실행됨 print('숫자를 0으로 나눌 수 없습니다.') else: # try의 코드에서 예외가 발생하지 않았을 때 실행됨 print(y)
## 예외가 발생하지 않았알때는 else의 print(y) 실행
## 예외가 발생하였을때는 except의 print('숫자를 0으로 나눌 수 없습니다.') 실행
## try except 문에서의 finally 사용하기
## finally == 예외 발생 여부와 상관없이 항상 코드를 실행하는 한다.
## finally는 except와 else를 생략할 수 있다. (생략 가능)
# try:
# 실행할 코드
# except:
# 예외가 발생했을 때 처리하는 코드
# else:
# 예외가 발생하지 않았을 때 실행할 코드
# finally:
# 예외 발생 여부와 상관없이 항상 실행할 코드
try: x = int(input('나눌 숫자를 입력하세요: ')) y = 10 / x except ZeroDivisionError: # 숫자를 0으로 나눠서 에러가 발생했을 때 실행됨 print('숫자를 0으로 나눌 수 없습니다.') else: # try의 코드에서 예외가 발생하지 않았을 때 실행됨 print(y) finally: # 예외 발생 여부와 상관없이 항상 실행됨 print('코드 실행이 끝났습니다.') # 나눌 숫자를 입력하세요: 2 # 5.0 # 코드 실행이 끝났습니다. # 나눌 숫자를 입력하세요: 0 # 숫자를 0으로 나눌 수 없습니다. # 코드 실행이 끝났습니다.
## 숫자를 0으로 나누어 예외가 발생하지만 finally의 print('코드 실행이 끝났습니다.')는 항상 실행되는 걸 볼 수 있다.
#### try 안에서 만든 변수는 try 바깥에서 사용할 수 있나요? ####
## try는 함수가 아니므로 스택 프레임을 만들지 않는다.
# 따라서 try 안에서 변수를 만들더라도 try 바깥에서 사용할 수 있다. 물론 except, else, finally에서도 사용할 수 있다.
728x90'TIL' 카테고리의 다른 글
TIL.39 HTML.CSS 알아보기(wecode_1일차) (0) 2020.11.16 TIL.38 예외 발생시키기 및 만들기 (0) 2020.11.15 TIL.36 selenium을 이용한 이미지 크롤링 자동화 (2) 2020.11.13 TIL.35 두점 사이의 거리 구하기 (0) 2020.11.12 TIL.34 클래스 상속(오버라이딩 및 추상클래스) (0) 2020.11.11