Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
ruthetum opened this issue Jun 19, 2022 · 0 comments
Assignees
Labels
10장 예외

Comments

@ruthetum
Copy link
Member

예외의 상세 메시지에 실패 관련 정보를 담으라

스택 추적

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

이 정보는 실패 원인을 분석해야 하는 프로그래머나 SRE가 얻을 수 있는 유일한 정보인 경우가 많다.

따라서 실패 원인에 관한 정보를 가능한 한 많이 담아 반환하는 일은 매우 중요하다.


발생한 예외에 관여된 모든 매개변수와 필드의 값을 실패 메시지에 담아라

예를 들어 IndexOutOfBoundsException의 상세 메시지는 범위의 최솟값, 최댓값 그리고 그 범위를 벗어났다는 인덱스의 값을 담아야 한다.

실패의 원인이 다양할 수 있기 때문에 원인을 추적할 수 있는 모든 데이터를 제공해야 한다.

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

stack trace 정보를 관련되지 않은 사람도 볼 수 있으므로 비밀번호, 암호 키와 같은 정보를 담아서는 안 된다.


관련 데이터를 모두 담아야 하지만 장황할 필요는 없다.

문제 발생 시 stack trace 뿐만 아니라 관련 문서와 필요하다면 소스 코드를 함께 살펴본다.

따라서 문서와 소스 코드에서 얻을 수 있는 정보들을 길게 담는 것은 사족일 뿐이다.

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

최종 사용자에게는 친절한 안내 메시지를 보여줘야 하는 반면, 예외 메시지는 가독성보다는 담긴 내용이 더욱 중요하다.


예외 생성자를 통해 상세 메시지를 미리 생성하는 방법

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

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

자바 9에서는 IndexOutOfBoundsException에 정수 인덱스 값을 받는 생성자가 추가되었지만, 최솟값과 쵯댓값까지는 받지 않고 있다.


정리

실패 원인에 관한 정보를 가능한 한 많이 담아 반환하는 일은 매우 중요하다.

예외 메시지는 가독성보다는 담긴 내용이 더욱 중요하다.

예외는 실패와 관련한 정보를 얻을 수 있는 접근자 메서드를 적절히 제공하는 것이 좋다.

@ruthetum ruthetum added the 10장 예외 label Jun 19, 2022
@ruthetum ruthetum self-assigned this Jun 19, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
10장 예외
Projects
None yet
Development

No branches or pull requests

1 participant