예외 처리는 견고한 프로그램의 필수 요소입니다. 이 치트시트는 try/except/else/finally 구조, raise from으로 원인 보존, 자원 정리(with) 등 실전 패턴을 정리합니다.
언제 이 치트시트를 보나?
- “여기서 어떤 예외를 잡아야 하지?”가 애매할 때
- 원인 예외를 잃지 않고 더 좋은 메시지로 감싸고 싶을 때
핵심 패턴
- 좁게 잡기:
except Exception: 남용보다 구체 예외를 먼저 - 성공/실패 분리:
try/except/else로 “성공 로직”을 else에 두면 깔끔 - 원인 보존:
raise NewError(...) from e - 자원 정리:
finally보다 with(context manager)를 우선 고려
최소 예제
1
2
3
4
5
| def parse_int(s: str) -> int:
try:
return int(s)
except ValueError as e:
raise ValueError(f"invalid int: {s!r}") from e
|
1
2
3
4
5
6
7
8
9
| # try/except/else/finally
try:
x = 10 / 2
except ZeroDivisionError:
print("divide by zero")
else:
print("ok:", x)
finally:
print("always runs")
|
1
2
3
| # with: 자원 정리
with open("data.txt", "r", encoding="utf-8") as f:
data = f.read()
|
자주 하는 실수/주의점
- 너무 넓게 잡으면 버그가 숨겨짐(
except Exception: pass) → 로깅/재발생(raise) 전략 필요 - 에러 메시지에 사용자 입력을 넣을 때는
repr(!r)로 안전하게 assert는 운영에서 최적화 옵션으로 비활성화될 수 있음 → 입력 검증은 예외로 처리
관련 링크(공식 문서)