예외 처리 방법
기본 작업 흐름이 불가능하면 다른 작업 흐름으로 자연스럽게 유도한다.
throws를 선언해 예외를 알아서 던져지게 하거나
catch로 잡은 후에 로그와 함께 다시 예외를 던진다. 아래는 예시다.
public void add() throws SQLException{}
public void add() throws SQLException {
try {
}
catch(SQLException e) {
throw e;
}
}
목적 1: 내부 예외를 그대로 던지는 것이 예외상황에 대한 적절한 의미를 부여해주지 못하기 때문.
예: 서비스 계층 등에서 왜 SQLException이 발생했는 지 쉽게 알 수 없다.
해결: DAO에서 SQLException 정보를 해석해서 DuplicateUserIdException으로 바꿔 던진다.
중복 아이디 값으로 에러가 나는 경우 아래처럼 예를 들 수 있다.
try {
} catch(SQLException e) {
if(e.getErrorCode() == MysqlErrorNumbers.ER_DUP_ENTRY)
throw DuplicateUserIdException(); // 체크하셈.
else throw e; // 그 외의 경우는 그대로 SQLException 던진다.
}
보통 전환하는 예외에 원래 발생한 예외를 담아서 중첩 예외로 만드는 것이 좋다.
중첩 예외 만드는 방법
... throw DuplicateUserIdException(e);
//또는
... throw DuplicateUserIdException().initCause(e);
목적 2: 예외를 처리하기 쉽고 단순하게 만들기 위해서 포장하는 것이다.