파이썬 하루 하나씩 배우기: 예외 처리의 시작, try/except
코드 짜다 멈춰 본 적 있으신가요? 특히 파일을 다루거나 사용자 입력을 받을 땐, 예외 상황이 일상입니다.
오늘은 그 상황을 우아하게 넘기는 방법, try/except를 알려드립니다.
이 글은 파이썬의 예외 처리 기법인 try/except
을 완전히 이해하고, 실전에 적용하기 위한 가이드입니다.
초보자도 쉽게 따라올 수 있도록 구성되어 있으니, 한 걸음씩 함께 걸어봅시다.
예외란 무엇인가?
파이썬에서 ‘예외(Exception)’란, 프로그램이 실행되는 도중에 발생하는 의도치 않은 오류 상황을 말합니다. 예를 들어, 0으로 나누거나, 존재하지 않는 파일을 열려고 시도할 때 이런 예외가 발생합니다.
파이썬은 예외가 발생하면 기본적으로 프로그램을 종료시킵니다. 하지만 우리가 직접 이 예외를 감지하고 처리할 수 있다면? 오류는 더 이상 무서운 존재가 아니라, 사용자 경험을 지키는 안전 장치가 됩니다.
# 예외 발생 예시
print(10 / 0) # ZeroDivisionError
✔ 핵심은 이것!
예외는 피하는 것이 아니라, ‘예측하고’ 다루는 것이다.
try/except의 기본 구조
예외 처리는 try
블록 안에서 코드 실행을 시도하고, except
블록에서 오류를 처리하는 방식으로 작동합니다. 아래는 기본적인 구조입니다.
구성 요소 | 설명 |
---|---|
try | 실행을 시도하는 코드 블록 |
except | 예외가 발생했을 때 처리할 코드 |
else | 예외 없이 try 블록이 성공적으로 실행된 경우 |
finally | 예외 발생 여부와 관계없이 무조건 실행 |
try:
result = 10 / 0
except ZeroDivisionError:
print("0으로 나눌 수 없습니다.")
“실패는 예정된 이벤트다. 그걸 예측하지 못하면, 그건 선택이 아니라 방심이다.”
특정 예외 처리하기
파이썬에서는 다양한 예외 종류가 있으며, 이를 정확히 명시하여 처리할 수 있습니다. 다음은 자주 사용하는 예외들의 예시입니다.
- ZeroDivisionError: 0으로 나눌 때
- ValueError: 타입은 맞지만 부적절한 값일 때 (예: int(‘문자열’))
- FileNotFoundError: 없는 파일을 열 때
예외를 정확히 지정해서 처리하면, 프로그램은 더 스마트해집니다. 실패를 ‘예상한 실패’로 바꾸는 게 진짜 개발이죠.
else와 finally의 활용
try/except
는 단순히 예외를 처리하는 데 그치지 않습니다. else
와 finally
를 활용하면 더 정교하고 예측 가능한 흐름 제어가 가능합니다.
else
블록은 예외가 발생하지 않았을 때 실행되며, finally
는 예외 발생 여부와 관계없이 항상 실행됩니다. 특히 리소스를 반환하거나 정리 작업을 할 때 finally는 필수입니다.
블록 | 의미 | 실행 조건 |
---|---|---|
else | try 블록이 성공적으로 실행된 경우 | 예외 없음 |
finally | 항상 실행되는 마무리 코드 | 항상 |
try:
print("10 / 2 =", 10 / 2)
except ZeroDivisionError:
print("0으로 나눌 수 없습니다.")
else:
print("예외가 발생하지 않았습니다.")
finally:
print("모든 작업이 종료되었습니다.")
“마무리를 망치면, 과정이 아무리 좋아도 실패처럼 느껴진다. finally는 그걸 막는 마지막 끈이다.”
예외 처리의 모범 사례
예외 처리는 단순히 try/except
를 쓰는 게 아니라 언제, 왜, 어떻게 처리할 것인가에 대한 전략입니다. 다음은 실무에서 많이 사용되는 예외 처리 베스트 프랙티스입니다.
Best Practice | 설명 |
---|---|
최소 범위로 예외 처리 | 전체 함수가 아닌 문제 발생 가능성이 있는 부분만 try 처리 |
구체적인 예외 지정 | except 뒤에는 항상 예상 가능한 예외만 지정 |
에러 로그 출력 | traceback을 기록하거나 사용자에게 메시지 전달 |
finally로 리소스 정리 | 파일, DB 연결 등을 안전하게 정리 |
“코드는 언젠가 실패한다. 문제는 언제 실패하느냐가 아니라, 그걸 어떻게 맞이하느냐에 있다.”
자주 발생하는 실수와 그 해결법
아래는 초보자들이 자주 저지르는 예외 처리 실수와 그에 대한 해결책입니다. 알고만 있어도 에러 디버깅 시간이 확 줄어듭니다.
- 모든 예외를 except 하나로 처리 → 반드시 예외명을 명시하세요.
- 예외 발생 원인을 무시한 채 pass 처리 → 로깅이나 메시지 출력은 꼭 남겨야 합니다.
- try 블록 범위를 너무 크게 설정 → 실제 문제가 아닌 곳에서도 except가 작동하게 됩니다.
“예외를 무시하는 건, 현실을 외면하는 거랑 똑같아. 결국 돌아와서 발목 잡아.”
실전 후기: 예외 처리는 실수의 기록에서 시작된다
“코드는 돌아갔는데, 파일이 사라졌다. 로그를 뒤져봤더니, 예외가 발생했지만 아무 처리도 안 해놨더라고요. 그때 깨달았어요. 예외 처리는 사치가 아니라 생존이에요.”
처음엔 try/except
이 귀찮게 느껴졌습니다. ‘그냥 오류 나면 터뜨리면 되지’라는 생각이었죠. 그런데 실제 서비스에 배포된 코드에서 단 한 줄의 except 누락이 수십 명의 사용자 데이터를 날려먹을 뻔한 사건이 있었어요. 다행히 백업이 있어서 복구는 했지만, 그날 이후로 제 코드엔 무조건 예외 처리가 들어갑니다.
✔ 핵심은 이것!
실수는 피할 수 없지만, 예외 처리는 그 실수를 기록하고 복구하는 유일한 무기입니다.
사용자 꿀팁: 예외 처리를 예쁘게 쓰는 3가지 방식
- with 문과 함께 사용하기
파일 입출력은 예외 처리와 세트로 씁니다.with open(...)
문을 쓰면 자동으로 리소스가 정리되어finally
역할도 덜 수 있어요. - 로깅 라이브러리 사용
print
대신logging
을 쓰면 나중에 로그 분석이 쉬워집니다. 특히logger.exception()
은 스택트레이스까지 남겨줘요. - 예외를 새로 만들어서 던지기
상황에 맞는 사용자 정의 예외를 만들면 디버깅이 훨씬 수월합니다. 팀 단위 프로젝트에선 필수예요.
“코드는 당신을 배신하지 않는다. 당신이 스스로 무시한 조건만 배신할 뿐이다.”
logging
모듈을 활용해 저장하는 것도 좋습니다.pass
로 무시하는 건 문제를 방치하는 겁니다. 최소한 로그라도 남겨두는 게 좋습니다.시각 자료 및 참고 링크: 예외 처리의 시각적 이해

이미지 출처: Enterprise DNA Blog

이미지 출처: 취미생활 블로그
📚 참고 링크
- W3Schools: Python Try Except – try/except의 기본 구조와 예제를 제공합니다.
- Medium: 5 Best Practices for Python Exception Handling – 예외 처리의 모범 사례를 다룹니다.
- Python Land: Python Try Except – 예외 처리의 심화 내용을 설명합니다.
- Python 공식 문서: Errors and Exceptions – 예외 처리에 대한 공식 문서입니다.
마무리하며: 실패는 다뤄야 할 현실이다
파이썬을 배우면서 가장 많이 마주치는 것이 오류입니다. 이 글을 통해 예외 처리라는 도구가 단순히 오류 회피용이 아니라, 프로그램의 신뢰성과 사용자 경험을 지키는 보호망임을 느끼셨을 거예요.
실패를 두려워하지 마세요. 중요한 건 그 실패를 어떻게 다루느냐입니다. try/except
는 실패를 안아주는 코드의 포옹이니까요. 내일은 이보다 더 강력한 ‘사용자 정의 예외 클래스’를 다뤄볼게요!
“예외는 에러가 아니다. 배려다.”

※ 블로그 작성 7단계 흐름도 시각 요약
HANSORI.AI_Blog Labs에서 더 알아보기
구독을 신청하면 최신 게시물을 이메일로 받아볼 수 있습니다.