JAVA/Effective Java

[아이템 75] 예외의 상세 메시지에 실패 관련 정보를 담으라

꾸준함. 2024. 3. 29. 09:15

예외를 잡지 못해 프로그램이 실패하면 자바 시스템은 아래와 같이 해당 예외의 stack trace 정보를 자동으로 출력합니다.

 

 

예상하지 못한 장애가 발생했을 때 위와 같은 정보가 실패 원인을 분석해야 하는 개발자 혹은 SRE가 얻을 수 있는 유일한 정보인 경우가 많습니다.

특히 재현하기 어려운 장애일 경우 더 자세한 정보를 얻기가 어렵거나 불가능하기 때문에 예외의 toString() 메서드에 실패 원인에 관한 정보를 가능한 많이 담아 반환해야 합니다.

 

예외 메시지 관련 원칙

  • 실패 순간을 포착하려면 발생한 예외와 관련된 모든 매개변수와 필드의 값을 실패 메시지에 담아야 함
  • stack trace에는 예외가 발생한 파일명과 예외가 발생한 line이 출력되는 것이 일반적이므로 문서와 소스코드를 통해 얻을 수 있는 정보는 굳이 넣어줄 필요 없음
  • 예외의 상세 메시지와 클라이언트에게 노출할 오류 메시지를 혼동해서는 안됨
    • 클라이언트에게는 사용자 친화적인 안내 메시지를 표시해야 하지만,
    • 예외 메시지는 주로 로그를 분석하는 운영팀이나 개발자가 사용하기 때문에 가독성보다는 원인을 빠르게 파악할 수 있는 메시지가 중요

 

  • 실패를 적절히 포착하려면 필요한 정보를 예외 생성자에서 모두 받아서 상세 메시지까지 미리 생성해 놓는 방법도 괜찮음
    • 고품질의 상세 메시지를 만들어내는 코드를 예외 클래스 안으로 모아주는 효과가 있어, 클래스 사용자가 메시지를 별도로 생성해야 하는 중복 작업을 수행하지 않아도 됨 
    • ex) 배열의 범위를 넘어서는 인덱스에 접근하려고 시도하는 경우 IndexOutOfBoundsExceptoin의 상세 메시지는 배열 범위의 최솟값, 최댓값, 그리고 범위를 벗어났다는 인덱스의 값 정보를 포함

 

 

 

* 주의: 단, 유저의 비밀번호와 같은 보안에 문제되는 정보는 절대 담으면 안 됩니다.

 

참고

이펙티브 자바

반응형