View

반응형

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

예외의 toString() 메서드에 실패 원인에 관한 정보를 가능한 많이 담아 반환하는 것은 굉장히 중요하다. 실패 원인을 얻을 수 있는 유일한 정보일 수도 있고 재현하기 어려운 오류일 경우 더 자세한 정보를 얻기 어렵기 때문이다.

 

예외에 관여된 모든 매개변수, 필드의 값을 실패 메시지에 담자

예를 들어, IndexOutOfBoundsException의 상세 메시지에는 범위의 최솟값과 최댓값, 그리고 범위를 벗어난 인덱스의 값을 담아야 한다. 원인이 될 수 있는 모든 매개변수와 필드 값을 실패 메시지에 담으면 무엇을 고쳐야 할지 분석하는데 큰 도움이 된다.

 

IndexOutOfBoundsException은 String을 매개변수로 받고 있어 메시지를 만들어 보내야 한다. Java9에서 index를 받는 생성자가 추가됐지만 여전히 최댓값과 최솟값은 받지 않는다. 따라서 다음과 같이 필요한 정보를 모두 생성자에서 받고 상세 메시지까지 미리 생성해놓는 것도 좋은 방법 중 하나다.

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

이렇게 하면 실패를 더 잘 포착할 수 있게되고 예외 상세 메시지를 예외 클래스 안으로 모아주는 효과가 있어 프로그래머가 메시지를 만드는 작업을 중복하지 않아도 된다.

 

실패 메시지가 장황할 필요는 없다.

관련 데이터를 모두 담아야 하지만 장황할 필요는 없다. 대부분의 프로그래머는 스택 추적과 함께 코드를 살펴보기 때문에 문서와 소스코드에서 얻을 수 있는 예외 정보는 오히려 군더더기가 될 수 있다.

 

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

예외 메시지의 주 소비층은 문제를 분석해고 해결하는 프로그래머이다. 따라서 가독성보다는 안에 담긴 내용들이 훨씬 중요하다. 반면, 최종 사용자에게는 친절한 오류 메시지를 전달해야 한다.

 

실패와 관련된 정보를 얻을 수 있는 접근자 메서드를 적절히 제공하자.

실패 정보는 예외 상황을 복구하는데 유용하므로 비검사 예외보다는 검사 예외에서 더 활용 가능성이 높다.

상대적으로 비검사 예외의 상세 정보에 접근하기 원하는 프로그래머는 드물지만, toString() 메서드를 제공하는 API라면 비검사 예외라도 상세 정보를 알려주는 접근자 메서드를 제공하면 좋다.

반응형
Share Link

인기 글

최신 글

전체 방문자

Today
Yesterday