스터디 날짜
24.07.29.
스터디 범위
4장. 예외
Error
Exception과 체크 예외
애플리케이션 코드 상에 예외사항이 발생했을 때 java.lang.Exception
클래스가 사용된다.
Exception 클래스는 체크 예외와 언체크 예외로 구분된다.
일반적으로 예외는 체크 예외라고 생각하면 된다.
→ ex) IOException, SQLException
체크 예외가 발생할 수 있는 메서드를 사용할 때는 반드시 예외 처리 코드를 함께 작성해야 한다.
→ 체크 예외는 복구할 가능성이 조금이라도 있는, 예외사항을 다루기 때문.
RuntimeException과 언체크/런타임 예외
명시적인 예외 처리를 강제하지 않으며, 프로그램 오류가 있을 때 발생되도록 의도된 것들이다.
→ ex) NULLPointerException, IllegalArgumentException
런타임 예외는 예상치 못했던 상황에서 발생하는 것이 아니고, 피할 수 있지만 개발자의 부주의에 의해 발생할 수 있는 예외를 다룬다.
→ 체크 예외는 예외 처리를 강제하는 것 때문에 예외 블랙홀이나 무책임한 throws 코드가 남발되어 비난의 대상이 되기도 했다.
예외 복구
예외처리 회피
→ thorws 문으로 선언 or catch 문으로 예외를 잡고 rethrow
public void add() throws SQLException {
try {
//
} catch(SQLException e) {
// pring log
throw e;
}
}
예외 전환
중복 아이디 사용자를 등록하려고 할 때 SQLException → DuplicationUserIdException
public void add(User user) thorws DuplicateUserIdException, SQLException {
try {
// DB에 User 추가
} catch(SQLException e) {
if (e.getErrorCode() == MysqlErrorNubmers.ER_DUP_ENTRY)
throw DuplicateUserIdException();
else
throw e;
}
}
catch(SQLException e) {
throw DuplicateUserIdException(e);
}
catch(SQLException e) {
throw DuplicateUserIdException().initCause(e);
}
public class DuplicateUserIdException extends RuntimeException {
public DuplicateUserIdException(Throwable cause) {
super(cause);
}
}
public void add() thorws DuplicateUserIdException {
try {
//
} catch (SQLException e) {
if (e.getErrorCode() == MysqlErrorNubmers.ER_DUP_ENTRY)
throw new DuplicateUserIdException(e); //예외 전환
else
throw new RuntimeException(e); //예외 포장
}
}
→ 낙관적인 예외처리 기법. 복구할 수 있는 예외는 없다고 가정하고 예외가 생겨도 런타임 예외이므로 시스템 레벨에서 처리하거나 꼭 필요한 경우는 런타임 예외를 잡아 복구하거나 대응해줄 수 있다는 태도를 기반으로 함.
try {
BigDecimal balance = account.withdraw(amount);
} catch(InsufficientBalanceException e) {
BigDecimal availFunds = e.getAvailFunds();
//잔고 부족 메시지를 준비하고 이를 출력하도록 진행
}
아래의 두 가지 문제를 해결해야 한다.
SQLException의 비표준 에러 코드
if (e.getErrorCode() == MysqlErrorNumbers.ER_DUP_ENTRY) { ...
→ DB별로 DB에러 코드가 다르기 때문에 DB 독립적인 코드가 될 수 없다.
SQLException이 제공하는 SQL 상태 정보
→ DB의 JDBC드라이버에서 SQLException을 담을 상태 코드를 정확하게 만들어주지 않는 문제가 있다.