- 예외를 잡지 못해 프로그램이 실패하면 자바 시스템은 그 예외의 stack trace 정보를 자동으로 출력함. stack trace는 예외 객체의
toString
메서드를 호출해 얻는 문자열임. 보통 예외의 클래스 이름 뒤에 상세 메시지가 붙는 형태 - 이 정보가 실패 원인을 분석해야 하는 프로그래머 혹은 SRE(site reliability engineer)가 얻을 수 있는 유일한 정보인 경우가 많음
- 더구나 그 실패를 재현하기 어렵다면 더 자세한 정보를 얻기가 어렵거나 불가능함. 따라서 예외의
toString
메서드에 실패 원인에 관한 정보를 가능한 한 많이 담아 반환하는 일은 아주 중요함
지침
실패 순간을 포착하려면 발생한 예외에 관여된 모든 매개변수와 필드의 값을 실패 메시지에 담아야 한다
- 예로, IndexOutOfBoundsException의 상세 메시지는 범위의 최솟값, 최댓값, 그리고 그 범위를 벗어났다는 인덱스의 값을 담아야 함
- 필요한 정보를 예외 생성자에서 모두 받아서 상세 메시지까지 미리 생성해 놓는 방법도 괜찮음
- 이렇게 해두면 고품질의 상세 메시지를 만들어내는 코드를 예외 클래스 안으로 모아주는 효과도 있어, 클래스 사용자가 메시지를 만드는 작업을 중복하지 않아도 됨
- 관련 데이터를 모두 담아야 하지만 장황할 필요는 없음. 문제를 분석하는 사람은 스택 추적뿐 아니라 관련 문서와 소스코드를 함께 살펴봄
- 예외의 상세 메시지와 최종 사용자에게 보여줄 오류 메시지를 혼동해서는 안 된다. 최종 사용자에게는 친절한 안내 메시지를 보여줘야 하는 반면, 예외 메시지는 가독성 보다는 담긴 내용이 훨씬 중요
- 예외는 실패와 관련된 정보를 얻을 수 있는 접근자 메서드를 적절히 제공하는 것이 좋다(앞의 예라면 lowerBound, upperBound, index) → 해당 정보를 코드를 통해 얻어내어 예외를 복구해내는데 사용할 수 있게 될 것임 (검사 예외에서 빛을 발함)
- 비검사 예외의 상세 정보에 프로그램적으로 접근하길 원하는 프로그래머는 드물 것
- 하지만, 비검사 예외라도 상세 정보를 알려주는 접근자 메서드를 제공하라고 권하고 싶다(toString이 반환된 값에 포함된 정보를 얻어올 수 있는 API를 제공하자 하는 일반원칙에 따라)