예외(exception)란 코드를 실행ㅎ나는 중에 발생한 에러를 뜻한다.
예외처리를 하려면 다음과 같이 try에 실행할 코드를 넣고 except에 예외가 발생했을 때 처리하는 코드를 넣는다.
try:
x = int(input("나눌 숫자를 입력하세요 : "))
y = 10/x
print(y)
except: # 예외가 발생했을 때 실행됨
print("예외가 발생했습니다.")
나눌 숫자를 입력하세요 : 5
2.0
나눌 숫자를 입력하세요 : 0
예외가 발생했습니다.
위 코드는 10을 입력한 숫자로 나눈다. 어떤 수를 0으로 나눌 수는 없으므로 0을 입력하면 예외가 발생한다.
<aside> 💡 try안에서 만든 변수는 try 바깥에서도 사용할 수 있다. try는 함수가 아니므로 스택 프레임을 만들지 않기 때문이다.
</aside>
except에 예외 이름을 지정해서 특정 예외가 발생했을 떄만 처리 코드를 실행하도록 할 수 있다.
y = [10, 20, 30]
try:
index, x = map(int, input("인덱스와 나눌 숫자를 입력하세요 : ").split())
print(y[index]/x)
except ZeroDivisionError:
print("숫자를 0으로 나눌 수 없습니다")
except IndexError:
print("잘못된 인덱스입니다.")
ZeroDivisionError는 어떤 수를 0으로 나누려고 할 때 발생하는 에러이고 IndexError는 잘못된 인덱스를 접근하려고 할 때 발생하는 에러다.
except 에서 as 뒤에 변수를 지정하면 발생한 예외의 에러 메세지를 받아올 수 있다.
y = [10, 20, 30]
try:
index, x = map(int, input("인덱스와 나눌 숫자를 입력하세요 : ").split())
print(y[index]/x)
except ZeroDivisionError as e:
print("숫자를 0으로 나눌 수 없습니다", e)
except IndexError as e:
print("잘못된 인덱스입니다.", e)
인덱스와 나눌 숫자를 입력하세요 : 1 0
숫자를 0으로 나눌 수 없습니다 division by zero
인덱스와 나눌 숫자를 입력하세요 : 4 2
잘못된 인덱스입니다. list index out of range
예외도 클래스 상속으로 구현되며 다음과 같은 계층으로 이루어져 있다. 보통은 Exception을 상속받아서 구현한다. 파이썬 공식 문서에서 전체 계층도를 볼 수 있다.