item75


예외의 상세 메시지에 실패 관련 정보를 담으라

예외를 잡지 못해 프로그램이 실패하면 자바 시스템은 그 예외의 스택 추적 정보를 자동으로 출력한다. 이 정보가 실패 원인을 분석해야 하는 프로그래머 혹은 사이트 신뢰성 엔지니어가 얻을 수 있는 유일한 정보인 경우가 많다. 따라서 예외의 toString 메서드에 실패 원인에 관한 정보를 가능한 한 많이 담아 반환하는 일은 아주 중요하다.

실패 메시지에 발생한 예외에 관여된 모든 매개변수와 필드의 값을 담아라

예컨데 IndexOutOfBoundsException의 상세 메시지는 범위의 최솟값과 최댓값, 그리고 그 범위를 벗어났다는 인덱스의 값을 담아야 한다. 이 정보는 실패에 관한 많은 것을 알려준다. 셋 중 한두 개 혹은 셋 모두가 잘못됏을 수 있다. 이상의 현상들은 모두 원인이 다르므로, 현상을 보면 무엇을 고쳐야 할지를 분석하는 데 도움이 된다.

<aside> 💡

보안과 관련된 정보는 주의해서 다뤄야 한다. 문제를 진단하고 해결하는 과정에서 스택 추적 정보를 많은 사람이 볼 수 있으므로 상세 메시지에 비밀번호나 암호 같은 정보까지 담아서는 안된다.

</aside>

예외의 상세 메시지와 최종 사용자에게 보여줄 오류 메시지를 혼동해서는 안 된다.

최종 사용자에게는 친절한 안내 메시지를 보여줘야 하는 반면, 예외 메시지는 가독성보다는 담긴 내용이 훨씬 중요하다. 또한 최종 사용자용 메시지는 현지어로 번역해주기도 하지만, 예외 메시지는 그런 일이 거의 없다.

실패를 적절히 포착하려면 필요한 정보를 예외 생성자에서 모두 받아서 상세 메시지까지 미리 생성해 두는 방법도 괜찮다.

/**
 * 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;
}

예외에 관련한 정보를 얻을 수 있는 접근자 메서드를 제공하라

예외는 실패와 관련한 정보를 얻을 수 있는 접근자 메서드를 적절히 제공하는 것이 좋다. 포착한 실패 정보는 예외 상황을 복구하는 데 유용할 수 있으므로 접근자 메서드는 비검사 예외보다는 검사 예외에서 더 빛을 발한다.

item76