노트

예외 처리 원칙

Exception Handling

설계#architecture · 연결된 개념 9개

쉽게 말하면

예외 처리는 공장 라인에서 문제가 생기면 그 자리 작업자가 붙잡고 씨름하지 않고 비상벨을 누르는 거예요. 벨은 관리실까지 울리고, 대응할 수 있는 그 한 곳에서 멈추고 알리고 기록해요.

비유가 깨지는 곳 비상벨은 정말 비상일 때만 눌러야 해요. 정상 흐름에 속하거나 미리 범위를 확인할 수 있는 경우엔 예외 대신 검사로 풀고, 잡아 놓고 아무것도 안 하는 건 가장 나쁜 선택이에요.

예외 처리 문법의 목적은 오류가 발생한 지점과 처리하는 지점을 떼어 놓는 것이다. 그래서 잘 처리한다는 건 try-catch를 많이 쓰는 게 아니라 잘 던지고, 사용자에게 대응할 수 있는 경계에서 한 번에 잡는 것이다.

  • 오류 코드 대신 예외(Replace Error Code with Exception): return -23 같은 오류 코드는 호출자마다 검사하고 위로 전달해야 한다. 예외는 핸들러를 찾을 때까지 스스로 콜 스택(Call Stack)을 거슬러 올라가므로 나머지 코드는 오류 상황을 신경 쓰지 않아도 된다
  • 예외는 정말 예외일 때만: 프로그램의 정상 흐름에 속하는 경우에는 쓰지 않는다. 판단법은 "이 throw를 프로그램 종료로 바꿔도 정상 동작하는가"를 따져 보는 것이다
  • 미리 검사할 수 있으면 검사로(Replace Exception with Precheck): 배열 범위 밖 접근을 catch해서 0을 돌려주기보다 호출 전에 범위를 확인한다
  • 던지고 경계에서 잡는다: 대부분의 함수는 UI(User Interface)에서 멀다. 그 자리에서 할 수 있는 일이 없으니 그냥 던지고, 컨트롤러나 전역 핸들러에서 잡아 동작을 멈추고 사용자에게 알리고 기록한다. 스프링은 스프링 전역 예외 처리, React는 에러 바운더리(Error Boundary)가 그 경계다
  • 폼 검증처럼 예상 가능한 실패는 검증 도구에 맡긴다(Bean Validation)

잡아 놓고 아무것도 안 하는 것은 가장 나쁜 선택이다(예외 삼키기). 파이썬의 "묻기보다 용서를 구하라(Easier to Ask for Forgiveness than Permission, EAFP)"와 "뛰기 전에 살펴라(Look Before You Leap, LBYL)" 사이의 선택은 EAFP와 LBYL에, 내부 가정 위반을 알리는 방법은 어서션에 있다.

출처: 『리팩터링 2판』 마틴 파울러 (원서 Refactoring, 2nd Edition) · refactoring.com: Replace Error Code with Exception · refactoring.com: Replace Exception with Precheck · Refactoring.Guru: Replace Error Code with Exception · 인프런 『심플 디자인』 박영록

연결된 개념

이 노트를 가리키는 문서

뜻이 가까운 노트

  • 심플 디자인

    켄트 벡이 XP(Extreme Programming)에서 제시한 단순한 설계의 네 가지 규칙. 우선순위 순으로 ① 모든 테스트를 통과하고 ② 의도를 드러내고 ③ 중복이 없고 ④ 요소가 가장 적다. 마틴 파울러가 이렇게 정리한 형태가 널리 쓰인다.

  • 섣부른 최적화

    "섣부른 최적화는 모든 악의 근원이다." 도널드 크누스(Donald Knuth)가 1974년 글 「Structured Programming with go to Statements」에서 쓴 말이다. 원문의 맥락은 작은 효율은 대부분(약 97%)의 경우 잊으라는 것이고, 정말 중요한 3%는 놓치지 말라는 말이 이어진다.

  • 최소 재현

    버그가 여전히 일어나는 가장 작은 코드와 조건을 만드는 것. 원인을 좁히고, 테스트로 고정하고, 남에게 묻기 쉬워진다.

  • YAGNI

    "그거 필요 없을 거야(You Aren't Gonna Need It)." 실제로 필요해지기 전까지 기능이나 확장 지점을 만들지 말라는 XP(Extreme Programming)의 원칙이다.

  • 집단 코드 소유

    코드의 주인을 개인으로 두지 않고 팀 전체가 코드베이스 전체를 소유해, 누구나 필요한 곳을 고칠 수 있게 하는 XP 실천법.

보기 옵션