3. 고급 예외 처리: else와 finally
try-except 구문은 에러가 나지 않고 성공했을 때만 실행할 else 블록, 에러의 유무와 상관없이 무조건 마지막에 실행되어야 하는 finally 블록과 결합하여 완벽한 에러 통제 파이프라인을 구축할 수 있습니다.
(다이어그램: 초록색 정상 경로는
try가 무사히 끝나면 else 블록을 통과하여 finally로 향합니다. 반면, 빨간색 에러 경로는 try 블록에서 번개를 맞으면 except 비상망으로 추락하지만 결국에는 똑같이 finally 출구를 통해 안전하게 빠져나가는 모습을 보여줍니다.)
코드 예제
예제를 통하여 else와 finally의 동작 원리를 알아보겠습니다.
try:
print("1. 파일 열기 시도 중...")
file_data = open("document.txt", "r")
except FileNotFoundError:
print("2. [오류] 파일을 찾을 수 없습니다. 예외가 잡혔습니다.")
else:
# try 블록이 에러 없이 무사히 통과했을 때만 실행됨
print("3. [성공] 파일을 무사히 열었습니다. 데이터를 읽습니다.")
print(file_data.read())
finally:
# 에러가 났든 안 났든, 심지어 return으로 빠져나가려 해도 무조건 실행됨
print("4. [마무리] 자원을 해제하고 파일 시스템을 닫습니다.")
finally의 중요성: 파일 시스템 닫기, 켜두었던 데이터베이스(DB) 연결 끊기 등 프로그램이 죽더라도 이 자원 처리만큼은 반드시 하고 죽으라는 최후의 보루 역할을 합니다.
정리
지금까지 우리는 에러를 단순히 피해야 할 두려운 존재로 여겼지만, try-except-finally라는 튼튼한 방어망을 치고 나면 에러마저도 프로그램의 정상적인 제어 흐름 안으로 편입시킬 수 있습니다. 특히 크롤링 머신이나 데이터를 임포트하는 기능을 24시간 가동시켜야 할 실무에서, 이 예외 처리 로직은 서버가 죽지 않고 버티게 해 주는 가장 든든한 생명줄 역할을 톡톡히 해낼 것입니다.
🎧 고급 예외 흐름 & Vibe Coding
🗣️ 학생 프롬프트 (AI에게 이렇게 명령해 보세요): “크롤링 로봇을 파이썬으로 만든다고 가정해 줘. 타겟 웹사이트에 접속을 시도(
try)하고, 접속에 실패하면 예외 처리(except)를, 무사히 접속했다면 데이터를 파싱(else)한 뒤, 성공 여부에 상관없이 마지막에는 무조건 인터넷 연결 자원을 종료(finally)하는 완벽한 4단계 파이프라인의 뼈대(구조) 코드를 작성해 줘.”
📝 코딩 필수 영단어
- Else: 그 밖의, 그 외에 (여기서는 “에러가 터지지 않고 무사히 넘어간다면 그 다음에” 라는 긍정적인 맥락으로 쓰입니다.)
- Finally: 마침내, 최종적으로. (성공하든 실패하든, 심지어 코드가 함수를 빠져나가려 해도 무조건 마지막으로 불려가는 필수 관문입니다.)
- Resource: 자원. (메모리, 파일, 네트워크, DB 연결 등 프로그램이 잠시 빌려 쓰는 한정된 컴퓨터 자원을 의미합니다.)
- Release (or Close): 해제하다, 놓아주다. (빌려 쓴 자원을 다 쓰고 나서 컴퓨터 시스템에 다시 반납하는 행위입니다.)