아이템 75. 예외의 상세 메시지에 실패 관련 정보를 담으라. - ksw6169/effective-java GitHub Wiki

예외의 toString() 에는 실패 원인에 관한 정보를 가능한 한 많이 담아 반환해야 한다.

  • 예외를 잡지 못해 프로그램이 실패하면 자바 시스템은 그 예외의 스택 추적 정보를 출력한다.
  • 스택 추적 정보는 예외 객체의 toString() 을 호출해 얻는 문자열이다.
  • 보통은 예외의 클래스 이름 뒤에 상세 메시지가 붙는 형태로 구성된다.
  • 스택 추적 정보는 실패 원인을 분석해야 하는 프로그래머 혹은 *SRE 엔지니어가 얻을 수 있는 유일한 정보인 경우가 많다.
  • 따라서 예외의 toString() 에는 실패 원인에 관한 정보를 가능한 한 많이 담아 반환해야 한다.
  • 실패 순간을 포착하려면 발생한 예외에 관여된 모든 매개변수와 필드의 값을 실패 메시지에 담아야 한다.
  • 예컨대 IndexOutOfBoundsException 의 상세 메시지는 범위의 최솟값과 최댓값, 그리고 그 범위를 벗어났다는 인덱스의 값을 담아야 한다.

SRE(Site Reliability Engineer, 사이트 신뢰성 엔지니어)

소프트웨어 툴을 활용해 시스템을 관리하고, 문제를 해결하고, 운영 태스트를 자동화하는 엔지니어를 말한다.

보안과 관련된 정보는 스택 추적 정보에 담지 말자.

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

관련 데이터를 모두 담아야 하나, 장황할 필요는 없다.

  • 스택 추적에는 보통 많은 정보가 들어 있다.
  • 또한 문제를 분석하는 사람은 스택 추적뿐 아니라 관련 문서, 소스코드를 함께 살펴본다.
  • 따라서 문서와 소스코드에서 얻을 수 있는 정보는 길게 늘여놔봐야 군더더기가 될 뿐이다.

예외의 상세 메시지와 최종 사용자에게 보여줄 오류 메시지를 혼동하지 말라.

  • 최종 사용자에게는 친절한 안내 메시지를 보여줘야 하지만, 예외 메시지는 가독성보다는 담긴 내용이 훨씬 중요하다.
  • 예외 메시지의 주 소비층은 문제를 분석해야 할 프로그래머와 SRE 엔지니어이기 때문이다.

예외 생성자에서 모두 받아서 상세 메시지까지 미리 생성해놓을 수도 있다.

  • 예를 들어 IndexOutOfBoundsException 을 수정한다면 다음과 같다.
  • 이렇게 해두면 프로그래머가 던지는 예외는 자연스럽게 실패를 더 잘 포착한다.
  • 또한 상세 메시지를 만들어내는 코드를 예외 클래스 안에 모아둘 수 있어 클래스 사용자가 메시지를 만드는 작업을 중복으로 하지 않아도 된다.
/**
 * 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;
}

예외는 실패와 관련된 정보를 얻을 수 있는 접근자 메소드를 적절히 제공하는 것이 좋다.

  • 앞의 예에서라면 lowerBound, upperBound, index 정도가 적당할 것이다.
  • 포착한 실패 정보는 예외 상황을 복구하는 데 사용할 수 있으므로 접근자 메소드는 검사 예외에서 더 유용할 수 있다.
  • 반대로 비검사 예외의 상세 정보에 프로그램적으로 접근하길 원하는 프로그래머는 드물 것이다.

참고 자료