1. 예외의 상세 메시지
사후 분석을 위해 실패 순간의 상황을 정확히 포착해 예외의 상세 메시지에 담자.
실패 순간을 포착하려면 발생한 예외에 관여된 모든 매개변수와 필드의 값을 실패 메시지에 담아야 한다.
예를 들어, IndexOutOfBoundsException 의 상세 메시지는 범위의 최솟값과 최댓값, 그리고 그 범위를 벗어난 인덱스의 값을 담아야 한다. 매개변수를 통해 무엇을 고쳐야 할지 분석하는데 큰 도움이 될 수 있다.
관련 데이터를 모두 담되, 장황할 필요는 없다.
문제를 분석하는 사람은 스택 추적 뿐만 아니라, 관련 문서와 소스코드를 함께 살펴보기 때문에 너무 장황하게 예외메세지에 담을 필요는 없다.
예외의 상세 메시지와 최종 사용자에게 보여줄 오류 메시지를 혼동해서는 안된다.
최종 사용자에겐 필수 파라미터를 포함한 가독성 위주, 예외 상세 메시지는 담긴 내용이 중요하다. 예외 메시지의 주 소비층은 문제를 분석해야 할 프로그래머와 SRE 엔지니어임을 잊지 말자.
2. 실패를 포착하는 방법
2-1. 필요한 정보를 예외 생성자에서.
예외 메시지에 필요한 정보를 예외 생성자에서 모두 받아서 상세 메시지까지 미리 생성해놓는 방법이 있다. 현재의 IndexOutOfBoundsException 생성자는 String 을 받지만, 아래와 같이 구현해도 좋았을 것이다.

/**
* IndexOutOfBoundsException을 생성한다.
*
* @param lowerBound 인덱스의 최솟값
* @param upperBound 인덱스의 최댓값 + 1
* @param index 인덱스의 실젯값
*/
public IndexOutOfBoundsException(int lowerBound, int upperBound, int index) {
// 실패를 포착하는 상세 메시지를 생성한다.
super(String.format(
"최솟값: %d, 최댓값: %d, 인덱스: %d",
lowerBound, upperBound, index));
// 프로그램에서 이용할 수 있도록 실패 정보를 저장해둔다.
this.lowerBound = lowerBound;
this.upperBound = upperBound;
this.index = index;
}
단순히 String 을 받는 것 보다, 예외 메시지에 필요한 정보들을 모두 받아 상세 메시지에 구현해 놓는 방법이다. 자바 9 이후의 IndexOutBoundsException 은 정수 인덱스 값을 받는 것이 포함되었지만, 최솟값과 최댓값을 받진 않는다.

아무튼 결론은, 예외의 상세 메시지를 보고 문제를 해결할 수 있도록 적절한 정보를 열심히 주워 담아 에러 메시지에 함께 날려보내도록 노력해보자.
'1️⃣ 백앤드 > 이펙티브 자바' 카테고리의 다른 글
| [아이템77] 예외를 무시하지 말라 (0) | 2024.12.11 |
|---|---|
| [아이템76] 가능한 한 실패 원자적으로 만들라 (0) | 2024.12.10 |
| [아이템74] 메서드가 던지는 모든 예외를 문서화해라 (1) | 2024.12.05 |
| [아이템73] 추상화 수준에 맞는 예외를 던져라 (0) | 2024.12.05 |
| [아이템72] 표준 예외를 사용하라 (0) | 2024.12.03 |