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

예상하지 못한 장애가 발생했을 때 위와 같은 정보가 실패 원인을 분석해야 하는 개발자 혹은 SRE가 얻을 수 있는 유일한 정보인 경우가 많습니다.
특히 재현하기 어려운 장애일 경우 더 자세한 정보를 얻기가 어렵거나 불가능하기 때문에 예외의 toString() 메서드에 실패 원인에 관한 정보를 가능한 많이 담아 반환해야 합니다.
예외 메시지 관련 원칙
- 실패 순간을 포착하려면 발생한 예외와 관련된 모든 매개변수와 필드의 값을 실패 메시지에 담아야 함
- stack trace에는 예외가 발생한 파일명과 예외가 발생한 line이 출력되는 것이 일반적이므로 문서와 소스코드를 통해 얻을 수 있는 정보는 굳이 넣어줄 필요 없음
- 예외의 상세 메시지와 클라이언트에게 노출할 오류 메시지를 혼동해서는 안됨
- 클라이언트에게는 사용자 친화적인 안내 메시지를 표시해야 하지만,
- 예외 메시지는 주로 로그를 분석하는 운영팀이나 개발자가 사용하기 때문에 가독성보다는 원인을 빠르게 파악할 수 있는 메시지가 중요
- 실패를 적절히 포착하려면 필요한 정보를 예외 생성자에서 모두 받아서 상세 메시지까지 미리 생성해 놓는 방법도 괜찮음
- 고품질의 상세 메시지를 만들어내는 코드를 예외 클래스 안으로 모아주는 효과가 있어, 클래스 사용자가 메시지를 별도로 생성해야 하는 중복 작업을 수행하지 않아도 됨
- ex) 배열의 범위를 넘어서는 인덱스에 접근하려고 시도하는 경우 IndexOutOfBoundsExceptoin의 상세 메시지는 배열 범위의 최솟값, 최댓값, 그리고 범위를 벗어났다는 인덱스의 값 정보를 포함
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* Constructs an IndexOutOfBoundsException. | |
* | |
* @param lowerBound the lowest legal index value | |
* @param upperBound the highest legal index value plus one | |
* @param index the actual index value | |
*/ | |
public IndexOutOfBoundsException(int lowerBound, int upperBound, | |
int index) { | |
// Generate a detail message that captures the failure | |
super(String.format( | |
"Lower bound: %d, Upper bound: %d, Index: %d", | |
lowerBound, upperBound, index)); | |
// Save failure information for programmatic access | |
this.lowerBound = lowerBound; | |
this.upperBound = upperBound; | |
this.index = index; | |
} |

* 주의: 단, 유저의 비밀번호와 같은 보안에 문제되는 정보는 절대 담으면 안 됩니다.
참고
이펙티브 자바
반응형
'JAVA > Effective Java' 카테고리의 다른 글
[아이템 77] 예외를 무시하지 말라 (2) | 2024.03.29 |
---|---|
[아이템 76] 가능한 한 실패 원자적으로 만들라 (0) | 2024.03.29 |
[아이템 74] 메서드가 던지는 모든 예외를 문서화하라 (0) | 2024.03.28 |
[아이템 73] 추상화 수준에 맞는 예외를 던지라 (0) | 2024.03.27 |
[아이템 72] 표준 예외를 사용하라 (0) | 2024.03.25 |