- 예외를 잡지 못해 프로그램이 실패하면 자바 시스템은 그 예외의 스택트레이스를 자동으로 출력한다.
- 스택트레이스는 예외 객체의 toString() 메서드가 반환하는 문자열이다.
- 따라서 예외의 toString() 메서드에 실패 원인에 관한 정보를 가능한 한 많이 담아 반환하는 일이 중요하다.
- 실패 순간의 상황을 정확히 포착해 예외의 상세 메시지에 담아야 한다.
- 실패 순간을 포착하려면 발생한 예외에 관여된 모든 매개변수와 필드의 값을 실패 메시지에 담아야 한다.(보안 관련 정보에 주의)
- 최종 사용자에게는 친절한 안내 메시지를 보여줘야 하지만, 예외 메시지는 가독성보다는 담긴 내용이 훨씬 중요하다.
- 아이템 70의 제안처럼, 예외는 실패와 관련한 정보를 얻을 수 있는 접근자 메서드를 적절히 제공하는 것이 좋다.
- 검사 예외는 항상 따로따로 선언하고, 각 예외가 발생하는 상황을 자바독의 @throws 태그를 사용하여 정확히 문서화하자.
- 공통 상위 클래스 하나로 뭉뚱그려 선언하는 일은 삼가자.
- 비검사 예외도 정성껏 문서화해두면 좋다.
- 비검사 예외는 프로그래밍 오류를 뜻하므로, 무엇인지 알려주면 프로그래머는 해당 오류가 나지 않도록 코딩하게 된다.
- 잘 정비된 비검사 예외 문서는 그 메서드를 성공적으로 수행하기 위한 전제조건이 된다.
- 발생 가능한 비검사 예외를 문서로 남기는 일은 인터페이스 메서드에서 특히 중요하다.
- 메서드가 던질 수 있는 예외를 각각 @throws 태그로 문서화하되, 비검사 예외는 메서드 선언의 throws 목록에 넣지 말자.
- 자바독 유틸리티는 throws와 @throws 태그로 동시에 명시된 예외와, @throws 태그로만 명시한 예외를 구분해준다.
- 검사 예외는 제대로 활용하면 API와 프로그램의 질을 높일 수 있다.
- 하지만 남발하면 쓰기 불편한 API가 된다.
- 왜냐하면 호출 코드에서 catch 블록으로 예외를 붙잡거나, 혹은 더 바깥으로 전파해야 하기 때문
- 게다가 스트림에서 검사 예외 던지는 메서드가 사용불가하므로 부담이 된다.
- 더 나은 방식이 없다면 비검사 예외를 사용해야 한다.
- 메서드가 단 하나의 검사 예외만 던질 때가 특히 크다.
- 오직 하나의 예외 때문에 try-catch 블록을 추가해야 한다.
- 자바에서 문제 상황을 알리는 타입(throwable)으로 검사 예외, 런타임 예외, 에러 총 3가지를 제공한다.
- 호출하는 쪽에서 복구하리라 여겨지는 상황이라면 검사 예외를 사용하라.
- 검사 예외를 던지면 호출자가 그 예외를 catch로 잡아 처리하거나 더 바깥으로 전파하도록 강제하게 된다.
- API 사용자에게 검사 예외를 던져주어 그 상황에서 회복해내라고 요구한 것이다.
- 그렇기 때문에 예외 상황에서 벗어나는 데 필요한 정보를 알려주는 메서드를 함께 제공
NewerOlder