예외(exception)란 코드를 실행ㅎ나는 중에 발생한 에러를 뜻한다.

try except로 사용하기

예외처리를 하려면 다음과 같이 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을 상속받아서 구현한다. 파이썬 공식 문서에서 전체 계층도를 볼 수 있다.