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

신명철·2022년 5월 1일
0

Effective Java

목록 보기
71/80

실패 관련 정보를 담아야 하는 이유

예외를 잡지못해 프로그램이 실패하면 자바 시스템은 그 예외의 스택 추적(stack trace) 정보를 자동으로 출력한다. 스택 추적은 예외 객체의 toString()메서드를 호출해서 얻는 문자열로, 보통은 예외의 클래스 이름 뒤에 상세 메시지가 붙는 형태다.

따라서 예외의 toString() 메서드에 실패 원인에 관한 정보를 가능한 한 많이 담아 반환하는 일은 아주 중요하다. 달리 말하면, 사후 분석을 위해 실패 순간의 상황을 정확히 포착해 예외의 상세 메시지에 담아야 한다.

실패 순간을 포착하려면 발생한 예외에 관여된 모든 매개변수와 필드의 값을 실패 메시지에 담아야 한다.

예컨대, IndexOutOfBoundsException의 상세 메시지는 범위의 최대, 최소값과 범위를 벗어난 인덱스의 값을 담아야 한다.

public IndextOutOfBoundsException(int lowerBound, int upperBound, int index){
	// 실패를 포착하는 상세 메시지를 생성한다.
    super(String.format(
    		"최솟값: %d, 최댓값: %d, 인덱스: %d",
            lowrBound, upperBound, index));
	
    // 프로그램에서 이용할 수 있도록 실패 정보를 저장한다
    this.lowerBound = lowerBound;
    this.upperBound = upperBound;
    this.index = index;
}

[아이템70] 에서 제안하였듯, 예외는 실패와 관련한 정보를 얻을 수 있는 접근자 메서드를 적절히 제공하는 것이 좋다. 포착한 실패 정보는 예외 상황을 복구하는 데 유용할 수 있으므로 접근자 메서드는 비검사 예외보다는 검사 예외에서 더 빛을 발한다. 비검사 예외의 상세 정보에 프로그램적으로 접근하길 원하는 프로그래머는 드물 것이기 때문이다.

하지만, 'toString이 반환한 값에 포함된 정보를 얻어올 수 있는 API를 제공하자' 하는 일반 원칙을 따른다는 관점에서는 비검사 예외라도 상세 정보를 알려주는 접근자 메서드를 제공하라고 권하고 싶다.

profile
내 머릿속 지우개

0개의 댓글