도찐개찐
[Python] 예외처리(try, Except, else, fanally) 본문
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 (에러가 있거나 없거나 상관없이 항상 수행 - 선택)
'PYTHON' 카테고리의 다른 글
[허깅페이스] pipeline 사용법 (0) | 2024.01.23 |
---|---|
[Python] getter, setter (0) | 2022.12.26 |
[Python] 클래스 (0) | 2022.12.26 |
[Python] 함수 (0) | 2022.12.26 |
[Mac] Seleninum Driver 설치 (0) | 2022.10.26 |