Python에서 예외 발생 여부와 관계없이 항상 실행되어야 하는 코드가 있다면 finally 절을 활용하는 것이 가장 깔끔한 방법입니다. finally 블록은 예외가 던져지든 그렇지 않든 무조건 실행되기 때문에, 파일 닫기나 리소스 해제 같은 정리(cleanup) 작업에 적합합니다.
try: # 코드 작성 except: handle_exception() finally: do_cleanup()
예외 발생 시에만 정리 작업을 수행해야 한다면
정리 작업이 오직 예외 상황에서만 필요한 경우라면 플래그 변수를 활용해 조건부로 실행할 수 있습니다:
should_cleanup = True try: # 코드 작성 should_cleanup = False except: handle_exception() finally: if should_cleanup: do_cleanup()
작동 원리는 다음과 같습니다. 코드가 끝까지 정상적으로 실행되면 should_cleanup이 False로 설정되어 finally 블록에서 정리 작업이 건너뛰어집니다. 반면 중간에 예외가 발생하면 should_cleanup은 True인 채로 남아 있으므로, finally 블록에서 do_cleanup()이 호출됩니다.
참고: 위 예제에서should_cleanup은 불리언 값이므로if should_cleanup:처럼 직접 비교하는 것이 올바른 표현입니다. 함수처럼 호출하는if should_cleanup():형태는 TypeError를 유발할 수 있습니다.
더 파이썬다운 대안: 컨텍스트 매니저(with 문)
파일, 네트워크 연결, 데이터베이스 세션처럼 자동 정리가 필요한 리소스를 다룰 때는 with 문(컨텍스트 매니저)을 사용하는 것이 더 권장됩니다:
with open("file.txt") as f:
data = f.read()
# 블록 종료 시 예외 여부와 관계없이 파일이 자동으로 닫힘
컨텍스트 매니저는 코드가 성공하든 실패하든 리소스를 확실하게 해제해 주기 때문에, 직접 try/finally 구조를 작성하는 것보다 가독성과 안정성 면에서 훨씬 유리합니다. 따라서 단순 리소스 정리라면 with 문을 우선 고려하고, 복잡한 흐름 제어가 필요할 때만 위에서 소개한 finally 기반 패턴을 사용하는 것이 좋습니다.