개요
어떤 프로그래밍 언어를 사용하든 예외(exception)가 발생하는 상황을 마주하게 됩니다. 파이썬은 다양한 내장 예외 처리 메커니즘을 제공하며, 각 예외 이름을 통해 오류를 체계적으로 처리할 수 있습니다. 또한 파이썬에는 finally라는 특별한 블록이 존재하는데, 이 블록은 예외가 처리되었는지 여부와 관계없이 항상 실행된다는 특징을 가집니다.
문법(Syntax)
try:
# 메인 파이썬 코드....
except:
# 선택적 블록
# 예외를 처리하는 코드
finally:
# 항상 실행되는 코드예제
아래 코드에서는 NameError라는 예외가 발생합니다. 선언되지 않은 변수를 참조하는 코드를 작성했는데, 예외가 처리되더라도 프로그램의 흐름은 결국 "finally" 블록으로 진입합니다. 즉, "finally" 블록 안의 코드도 함께 실행됩니다.
try:
var1 = 'Tutorials'
# NameError가 발생함
print(var2)
# 예외 처리
except NameError:
print("variable is not found in local or global scope.")
finally:
# 예외 발생 여부와 관계없이
# 이 블록은 항상 실행됨
print('finally block code here')실행 결과
위 코드를 실행하면 다음과 같은 결과가 출력됩니다.
variable is not found in local or global scope. finally block code here
예외 처리가 없는 경우
그렇다면 예외를 처리하지 않도록 코드를 설계하면 어떻게 될까요? 이 경우에도 finally 블록은 처리되지 않은(unhandled) 예외 상황에서 해당 코드를 실행합니다. finally 블록은 try 문이 정상적으로 종료되든, 예외로 인해 비정상적으로 중단되든 상관없이 반드시 실행되기 때문입니다.
예제
try:
var1 = 'Tutorials'
# NameError가 발생함
print(var2)
# 예외 처리 없음
finally:
# 예외 발생 여부와 관계없이
# 이 블록은 항상 실행됨
print('finally block code here')실행 결과
위 코드를 실행하면 finally 블록의 코드가 먼저 출력된 후, 처리되지 않은 예외에 대한 Traceback이 표시됩니다.
finally block code here
Traceback (most recent call last):
File "xxx.py", line 4, in
print(var2)
NameError: name 'var2' is not defined정리
finally 키워드는 파일 닫기, 데이터베이스 연결 해제, 임시 리소스 정리처럼 반드시 수행해야 하는 작업을 처리할 때 특히 유용합니다. 예외 발생 여부와 무관하게 실행이 보장되므로, finally 블록을 적절히 활용하면 프로그램의 안정성과 신뢰성을 크게 높일 수 있습니다.