<개인공부>/[Python]

[python] 파이썬 예외처리 try, except, else, finally 사용 방법

BlockDMask 2021. 6. 28. 00:30
반응형

안녕하세요. BlockDMask입니다.
오늘은 파이썬에서 예외를 처리하는 방법에 대해서 이야기해보려 합니다.

<목차>
1. 예외란? 예외처리 방법 try except
2. 예외 처리 방법 try, except, else, finally
   2-1) try + except
   2-2) try + except + else
   2-3) try + finally
   2-4) try + except + finally
   2-5) try + except + else + finally

 

1. 파이썬에서 예외를 처리하는 방법


1-1) 에러가 발생했을 때 프로그램의 흐름

일단 바로 에러가 있는 파이썬 프로그램을 실행시켜보겠습니다. 

print("== Program Start")

a = 99/0            # error
print(f"99/0 : {a}")

print("== Program End")

a = 99/0 라인이 실행이 된다면 프로그램은 error 가 발생할 것입니다.

프로그램을 실행시킨 결과를 보면 "== Program Start" 만 출력이 되고 
a = 99 / 0 에서 프로그램에서 에러가 발생해서 프로그램이 비정상 종료가 되었으므로

그 아래에 있는 print(f"99/0 ~") 와 print("== Program End") 는 실행이 안되는 것을 볼 수 있습니다.

즉, 에러가 발생한 위치에서 프로그램이 비정상 종료된다. 를 알 수 있습니다.

 

1-2) 에러가 발생했을 때 프로그램이 죽지 않도록 한다! 그것이 예외처리

실제로 유저가 사용하는 프로그램에서 에러가 발생했을때 프로그램이 죽도록 내버려 둔다면 정말 큰일이 날 수도 있습니다.
그렇기 때문에 개발자 입장에서는 에러가 발생할만한 곳에서 "에러가 발생하더라도 이렇게 해결하라" 하고 에러를 처리하는 "예외처리"라는 것을 이용해서 프로그램이 갑자기 죽는 것을 방지할 수 있습니다.

위와 똑같은 코드를 try, except를 이용해서 예외처리를 진행해 보겠습니다.

print("== Program Start")

try:
    a = 99/0            # error
    print(f"99/0 : {a}")
except:
    print("== error!!  but, still alive")

print("== Program End")

 먼저 코드를 살펴보면 try와 except라는 것이 있는 걸 볼 수 있습니다.
try 키워드를 에러가 발생하는, 에러가 발생할 것으로 예상되는, 에러가 있을 거 같은데???? 싶은 곳에 작성합니다.
try 내부에서 에러가 발생했을 때 바로 except 구문으로 넘어가게 됩니다.
except 구문에는 에러를 처리할 코드를 작성해주면 됩니다.
이상태에서 프로그램을 실행시켜보면

이렇게 99/0 이라는 끔찍한 에러가 발생했음에도 프로그램이 죽지 않고, 살아서 "== Program End" 까지 출력하고 끝나는 것을 볼 수 있습니다.

여기서 알아야 할 점은 "a=99/0 " 코드가 실행되면서 그 라인에서 에러가 발생하고 "바로" except로 넘어간다는 점입니다.
에러가 발생한 a=99/0 의 다음 줄은 실행되지 않는 것을 기억해야 합니다.

 

 

2. 파이썬 예외 처리 try, except, else, finally


2-1) 파이썬 try, except 예외처리

try : 에러가 발생할 것 같은, 예외처리를 하고 싶은 곳을 찾아서 try 구문에 코드를 작성합니다.
except : 에러가 발생했을 때 처리할 코드를 작성합니다.

print("== Program Start")

try:
    arr = ['b', 'l', 'o', 'g']
    print(arr[8]) # error
    print("== Mid")
except:
    print("== error!!  but, still alive")

print("== Program End")

리스트의 길이가 4인데, arr[8] 에 접근을 하게 되면 Index Error 가 발생하게 됩니다.
하지만 try except 구문으로 예외처리를 해주었기 때문에 에러가 발생하지 않고 프로그램이 종료된 걸 볼 수 있습니다.

 

2-2) 파이썬 예외처리 try, except, else

else 는 에러가 발생하지 않았을때 거치는 구문입니다. else만 단독으로 try + else 는 불가능합니다.
except 가 있어야 합니다.

print("== Program Start")

try:
    arr = ['b', 'l', 'o', 'g']
    print(arr[0])
    print("== Mid")
except:
    print("== error!!  but, still alive")
else:
    print("== else")

print("== Program End")

똑같은 코드에서 arr[8] 이 아닌 arr[0]을 해서 정상적으로 프로그램을 실행시켜보면 try 구문이 끝나고 else 구문으로 들어간 것을 볼 수 있습니다.

예외가 발생하지 않았으니 당연히 try 내부의 모든 코드가 실행이 됩니다. 그 후에 else. 구문의 코드가 실행되는 걸 볼 수 있습니다.

 

2-3) try + finally 구문

finally 는 에러가 발생해도, 발생하지 않아도 무조건 거치는 구문입니다.
except. 없이 try + finally 만 사용한다면
에러가 발생한 후에 finally 구문까지만 실행이 되고 프로그램이 중간에 죽게 됩니다.

print("== Program Start")

try:
    arr = ['b', 'l', 'o', 'g']
    print(arr[8])  # error
    print("== Mid")
finally:
    print("== finally")

print("== Program End")

결과를 보면 arr [8]에 접근하면서 프로그램이 바로 비정상 종료되어야 하는데 finally 까지는 가서 "== finally"를 출력하고 프로그램이 비정상 종료된 것을 볼 수 있습니다.

흔히 finally 예제로 드는 것은 파일 닫기입니다.
오픈한 파일이 에러가 발생하든 그렇지 않든 무조건 닫아야 하는 그런 경우에 finally에 파일 닫는 로직을 작성해야 하기 때문입니다.

 

 

2-4) try + except + finally

except 구문을 추가하고 finally 구문도 있는 예제를 보겠습니다.

print("== Program Start")

try:
    arr = ['b', 'l', 'o', 'g']
    print(arr[8])  # error
    print("== Mid")
except:
    print("== except")
finally:
    print("== finally")

print("== Program End")

결과를 보면 당연하게도 arr[8]에서 에러 발생 -> 그 뒤 코드 생략 -> 바로 except 구문이 있으니 예외 처리해서 프로그램 종료 안됨 -> 마지막으로 finally 구문 실행 -> 프로그램 정상 동작 -> print("== Program End") 출력하고 => 프로그램 정상 종료

이런 순서로 가게 됩니다.

 

2-5) try + except + else + finally

마지막으로 같은 코드를 두고 에러가 발생했을 때와 하지 않았을 때 출력 결과를 보겠습니다

편의상 에러 발생, 발생 안 하는 코드를 한 번에 보여드리기 위해서 주석 처리했습니다.
주석 처리 부분을 하나씩 지워서 프로그램을 실행시켜 보면 될 듯합니다.

print("== Program Start")

try:
    arr = ['b', 'l', 'o', 'g']
    # print(arr[0]) # not error
    # print(arr[8]) # error
    print("== Mid")
except:
    print("== except")
else:
    print("== else")
finally:
    print("== finally")

print("== Program End")

 

왼쪽이 에러가 발생했을 때 출력 결과이고
오른쪽이 에러가 발생하지 않았을 때 출력 결과입니다.

 

결론적으로 보면 기본적으로 예외처리를 하려면 try 와 except는 무조건 필요합니다.
예외가 발생하지 않는 상황에 뭔가를 처리해주려면 else 가 필요할 것이고
예외가 발생하든 안 하든 상관없이 무조건 try 구문이 종료되고 실행되어야 하는 구문이 있다면 finally를 추가하면 됩니다.

마지막으로 보기 좋게 정리 한번 해보았습니다.

try (해당 구문 안에서 에러 발생 시 처리 가능 - 필수)
except (에러 발생시 수행 - 선택이지만 에러를 처리하려면 필수)
else (에러 없을 때 수행 - 선택이지만 except 없이는 올 수 없음)
finally (에러가 있거나 없거나 상관없이 항상 수행 - 선택)

 

이렇게 파이썬에서 예외처리를 하는 방법에 대해서 알아보았습니다.
이제 실행 중인 프로그램이 죽을 것 같은 자리에, try except를 작성해 보세요.

반응형