맞는데 왜 틀릴까..?

Java/Effective Java

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

안도일 2023. 8. 12. 19:12

예외를 잡지 못해 프로그램이 실패하면 자바 시스템은 그 예외의 스택 추적 정보를 자동으로 출력한다.

스택 추적은 예외 객체의 toString 메서드를 호출해 얻는 문자열로, 보통 예외 클래스 이름 뒤에 상세 메시지가 붙는 형태다.

 

예외 상세 메시지

 

 

예외의 toString 메서드에 실패 원인에 관한 정보를 가능한 한 많이 담아 반환하는 일은 중요하다.

  • 실패 순간을 포착하려면 발생한 예외에 관여된 모든 매개변수와 필드의 값을 실패 메시지에 담아야 한다.
  • ex)IndexOutOfBoundsException의 상세 메시지는 범위의 최솟값, 최댓값, 그 범위를 벗어난 인덱스의 값을 모두 담는다.

 

보안과 관련한 정보는 주의해서 다뤄야 한다.

  • 스택 추적 정보는 많은 사람이 볼 수 있으므로 상세 메시지에 비밀번호나 암호 키 값은 정보까지 담아서는 안된다.

 

 

스택 추적에는 예외가 발생한 파일 이름과 줄번호, 스택에서 호출한 다른 메서드들의 파일까지 정확히 기록되어 있으므로 이러한 정보는 담을 필요 없다.

 

 

 

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

  • 예외 메시지는 가독성 보다 담긴 내용이 훨씬 중요하다.
  • 최종 사용자에게는 친절한 안내 메시지를 보여주어야 한다.

 

 

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

ex) 현재 IndexOutOfBoundsException 생성자는 String을 받지만 정수 인덱스 값과 최솟값, 최댓값을 받도록 작성