오류 코드 대신 예외를 던지자
미확인 예외를 사용하라
- 확인된 예외를 사용하면 throws 경로에 위치하는 모든 함수가 최하위 함수에서 던지는 예외를 알아야 하므로 캡슐화가 깨진다.
- 일반적인 애플리케이션은 의존성이라는 비용이 이익보다 크다.
예외에 의미를 제공하라
- 예외를 던질 때는 전후 상황을 충분히 덧붙인다.
- 오류 메세지에 정보를 담아 예외와 함께 던진다.
호출자를 고려해 예외 클래스를 정의하라
- 오류를 정의할 때 가장 중요한 관심사는 오류를 잡아내는 방법이 되어야 한다.
- 외부 API를 감싸면 외부 라이브러리와 프로그램 사이의 의존성이 크게 줄어든다.
- 특정 업체가 API를 설계한 방식에 발목 잡히지 않는다.
정상 흐름을 정의하라
- 예외가 논리를 따라가기 어렵게 만드는 특수 상황을 처리할 필요가 없다면 코드가 더 간결해 진다.
- 특수 사례 패턴 Special Case Pattern: 클래스나 객체가 예외적인 상황을 캡슐화해서 처리
null을 반환하지 마라, 전달하지 마라
- null을 반환하는 코드는 일거리를 늘리고, 호출자에게 문제를 떠넘긴다.
- 메서드에서 null을 반환하고픈 유혹이 든다면 그 대신 예외를 던지거나 특수 사례 객체를 반환한다.
- 많은 경우 특수 사례 객체가 손쉬운 해결책이다.
깨끗한 코드는 읽기도 좋아야 하지만 안정성도 높아야 한다.
오류 처리를 프로그램 논리와 분리하면 독립적인 추론이 가능해지며 코드 유지보수성도 크게 높아진다.