본문 바로가기
책 정리/토비의 스프링

4. 예외

by 이석준석이 2021. 1. 30.

1. 예외의 종류와 특징

 

1. Error

  • java.lang.Error 클래스의 서브클래스
  • 시스템에서 비정상적인 상황이 생기는 경우 (OutOfMemoryError / ThreadDeath) -> catch 블록으로 잡아도 아무 대응을 할 수 없음

 

2. Exception 과 체크 예외

  • java.lang.Exception 클래스와 그 서브클래스들 이며 RuntimeException을 상속받지 않은 Exception 들
  • throws 혹은 try/catch 사용이 강제된다. -> 사용하지 않으면 컴파일에러가 날 수 있다.
  • ex) IOException / SQLException 등, 예외상황에서 던져질 수 있는 것들

 

3. RuntimeException 과 언체크/런타임 예외

  • 체크예외와는 다르게, 예외처리를 강제하지 않는다. -> 원한다면 throws나 try/catch로 처리하는 것은 상관없다.
  • ex) NullPointerException / IllegalArgumentException


2. 예외 처리 방법

 

1. 예외 복구

  • 어떤 예외가 발생했을 시, 다른 방안을 사용하도록 안내해서 예외상황을 해결하는 방식이다.
  • 사용자 입장에서는 에러에 대해서 인식을 못하도록 하는 방식이다.
try {
    cache.get("이석준");
} catch (Exception e) {
    db.get("이석준");
}
int retry = MAX_RETRY_CONTSTANT;
while(retry-- > 0) {
    try {
        apicall("https://tistory.com");
    } catch (ReadTimeOutException e) {
        log.info("로그 출력");
    } finally {
    }
}

 

2. 예외처리 회피

  • 해당 예외를 호출한 쪽으로 throw 하여 던지는 방식이다.
  • 분명하게 예외처리를 상위에서 해야하는 경우에만 사용한다.
    • template / callback 에서 확실하게 template 에서 예외를 처리하게 하고싶은 경우에 사용하면 좋을 것 같다.

 

3. 예외 전환

  • 발생한 예외를 적절한 예외로 변환하여 던지는 것이다.
    • 분명한 의미를 주는 경우
    • 체크 예외를 언체크 예외로 전환하는 경우

예외 전환 방식 (중첩 예외) -> 이전에 발생한 예외를 담아서 던져주는 것. 중첩 예외를 만들기 위해서는 생성자가 필수 (throwable e)

try {
    apicall("https://tistory.com");
} catch (ReadTimeOutException e) {
    throw new TistoryUrlReadTimeOutException().initCause(e);
}

3. 스프링의 DataAccessException.class

 

  • 스프링의 DataAccessException.class 는 데이터 접근에서 발생할 수 있는 웬만한 에러들을 추상화하고 있다.
  • 데이터베이스 접근 기술들 (JDBC / JPA / 등등) 별로 예외들을 하나로 모아준다.

'책 정리 > 토비의 스프링' 카테고리의 다른 글

6.1. AOP  (0) 2021.02.02
5. 서비스 추상화  (0) 2021.02.01
3. 템플릿  (0) 2021.01.23
2. 테스트  (0) 2021.01.23
1장 오브젝트와 의존관계  (0) 2021.01.19