[python] 예외 처리 – try, except, else, finally

개발을 하다 보면 의도치않은 에러가 발생하는 경우가 생깁니다. 
잘못 개발을 하는 경우일 수도 있고, 의도와 다르게 사용하는 경우 등등 여러 경우에 에러가 발생합니다.

파이썬에서는 에러가 발생할 경우 프로그램을 중단하지 않고, 에러에 대한 처리를 할 수 있게 try, except, else, finally를 제공합니다.

전체 구문에 대한 흐름은 아래와 같습니다.

이제 예외 처리에 대해 하나하나 알아보겠습니다. 알아보겠습니다.

try-exception

아래는 예외 처리의 기본적인 형태입니다.

try:
    # 실행 코드
except:
    # 예외 시 실행 코드

try를 사용했으면 쌍으로 except:가 무조건 존재해야합니다.
아래는 10을 0으로 나눌 경우 발생하는 예외를 처리하는 코드입니다.

try:
    a = 10 / 0 # 0으로 나누면 예외 발생
    print("a:", a)
except:
    print("0으로 나눌 수 없습니다.")

특정 예외만 처리할 수도 있습니다. except 뒤에 특정 예외를 입력하시면 됩니다.

try:
    # 실행 코드
except 예외:
    #  특정 예외 발생 시 실행 코드

ZeroDivisionError는 0으로 나눌 때 발생하는 예외입니다. ZeroDivisionError만 처리 하고 싶으면 아래와 같이 코딩을 하면 됩니다.

try:
    a = 10 / 0 # 0으로 나누면 예외 발생
    print("a:", a)
except ZeroDivisionError:
    print("0으로 나눌 수 없습니다.")

ZeroDivisionError만 예외 처리했기 때문에, 아래의 경우에는 예외가 처리되지 않습니다.

list_a = [1, 2]
try:
    a = list_a[5] # 잘못된 인덱스이므로 예외 발생
    print("a:", a)
except ZeroDivisionError:
    print("0으로 나눌 수 없습니다.")

except 여러번 사용

발생되는 예외마다 다르게 처리하고 싶을 때 except를 여러 번 사용하면 됩니다.

try:
    # 실행 코드
except 예외1:
    #  예외1 발생 시 실행 코드
except 예외2:
    #  예외2 발생 시 실행 코드

아래는 ZeroDvisionError와 IndexError를 각각 처리하는 샘플 코드입니다.

list_a = [1, 2]
try:
    a = list_a[5] # 인덱스가 없어서 예외 발생
    print("a:", a)
except ZeroDivisionError:
    print("0으로 나눌 수 없습니다.")
except IndexError:
    print("잘못된 인덱스입니다.")

발생한 오류 메시지

에러에 대한 메시지를 보려면 아래와 같이 사용하면 됩니다.

try:
    # 실행 코드
except 발생한 오류 as 오류 메시지:
    # 예외 발생 시 실행 코드

아래는 에러 메시지를 표시하는 샘플 코드입니다.

list_a = [10, 20]

index = int(input("인덱스: "))
div = int(input("나눌값: "))
try:
    a = list_a[index]
    b = a / div
    print("a:", a)
    print("b:", b)
except Exception as e:
    print("예외 발생:", e)

else

else는 에러가 발생하지 않았을 때 try 구문 이후로 실행되는 부분입니다.
10을 0으로 나누면 ZeroDivisionError가 발생하지만 아래와 같이 1로 나누면 정상적으로 실행됩니다.

try:
    print("try:")
    a = 10 / 1
except Exception as e:
    print("except:", e)
else:
    print("else: a is", a)

else가 실행되는 것을 볼 수있습니다.

finally

finally는 에러가 발생 유무와 상관없이 코드를 실행합니다.

try:
    # 실행 코드
except:
    # 예외 시 실행 코드
finally:
    # 예외가 발생 유무와 상관없이 실행되는 코드

아래는 text 파일에서 읽어온 값이 0일 경우 예외가 발생해도 file을 close하는 코드입니다.

f = open("text.txt", "r")
try:
    read = int(f.read())
    print("read:", read)
    div = 10 / read # 읽어온 값이 0이면, ZeroDivisionError 발생
    print("div:", div)
except:
    print("예외 발생")
finally:
    f.close()
    print("file close")

예외 종류에 대한 자세한 내용은 아래 python 공식 문서를 참고하세요.