-
Notifications
You must be signed in to change notification settings - Fork 0
Open
Description
4.1.1 초난감 예외처리
예외블랙홀
- try {...} catch(SQLException e) { } 처럼 예외를 잡고 아무것도 하지 않음
- 예외가 발생했는데 그것을 무시하고 계속 진행하기 때문에 문제가 생김
- system out 으로 출력하는 것도 마찬가지
무의미하고 무책임한 throws
- 메소드 선언에 무의미하게 throws를 붙임
- 적절한 처리를 통해 복구될 수 있는 예외상황일 수 있으나 기회 박탈
4.1.2 예외의 종류와 특징
Error
- java.lang.Error 클래스의 서브클래스들로 시스템에 뭔가 비정상적인 상황이 발생했을 경우에 사용됨
- 어플리케이션에서는 신경안써도됨
체크 예외
- java.lang.Exception 클래스의 서브클래스이면서 RuntimeException을 상속하지 않은 것들
- 체크 예외를 던진다면 이를 catch문으로 잡든지, 다시 throws를 정의해 메소드 밖으로 던져야함
- IOException, SQLException등
언체크 예외
- RuntimeException을 상속하고 런타임 예외라고도 불림
- 피할 수 있지만 개발자가 부주의해서 발생할 수 있는 경우에 발생
- catch로 잡거나 throws로 안넘겨줘도 됨
4.1.3 예외처리 방법
예외 복구
- 예외로 인해 기본 작업 흐름이 불가능하면 다른 작업 흐름으로 자연스럽게 유도해주는 것
- 예를 들면 원격 DB 서버에 접속하다 실패해서 SQLException이 발생하는 경우 재시도를 해볼 수 있다
- 체크 예외들은 어떤 식으로든 복구가 가능할 가능성이 있는 경우에 사용
예외처리 회피
- throws로 던지거나 catch문으로 예외를 잡고 로그를 남긴 후 넘기는 방법
- 다른 오브젝트에게 예외처리 책임을 분명히 지게해야함
예외 전환
- 회피랑 다르게 발생한 예외를 그대로 넘기는 게 아니라 적절한 예외로 전환해서 던지는 것
- throws로 넘겨받은 SQLException이 왜 발생했는지 쉽게 알 수 없기 때문에 DuplicateUserIdException 같은 예외로 바꿔서 던져줌
- 원래 발생한 예외를 담아서 중첩 예외로 만들어 보내는게 좋음(DuplicateUserIdException().initCause(e)
- 주로 예외처리를 강제하는 체크 예외를 런타임 예외로 바꾸는 경우에 사용
- 체크 예외 중 복구 가능한 예외가 아닐 경우 런타임 예외로 바꿈
- 하지만 비즈니스적인 의미가 있는 예외는 적절한 대응이나 복구작업이 필요하기 때문에 체크 예외를 사용하는 것이 적절
4.1.4 예외처리 전략
런타임 예외의 보편화
- 체크 예외는 복구할 가능성이 조금이라도 있는 상황이기 때문에 java에서는 이를 처리하도록 강제한다
- 항상 복구할 수 있는 예외가 아니라면 일단 언체크 예외로 만드는 경향이 있음
- 언체크 예외로 바꿔서 메소드 밖으로 던지고 메소드 밖에서 다른 방법으로 해결
애플리케이션 예외
- 시스템 또는 외부의 예외상황이 원인이 아니라 애플리케이션 자체의 로직에
의해 의도적으로 발생시키고 반드시 catch 해서 무엇인가 조치를 취하도록 요구하는 예외 - 예를 들어 출금 시스템에서 잔고가 부족해서 SQLException이 발생한다면 런타임 에러로 바꿔서 넘기는게 아니라 비즈니스적인 의미를 띤 체크 예외로 바꿔서 고칠 수 있도록 안내
정리
- 예외를 잡아서 아무런 조취를 취하지 않거나 의미 없는 throws 선언을 남발하는 것은 위험
하다. - 예외는 복구하거나 예외처리 오브젝트로 의도적으로 전달하거나 적절한 예외로 전환해야
한다. - 좀 더 의미 있는 예외로 변경하거나 불필요한 catch/throws를 피하기 위해 런타임 예외로
포장하는 두 가지 방법의 예외 전환이 있다. - 복구할 수 없는 예외는 가능한 한 빨리 런타임 예외로 전환하는 것이 바람직하다.
- 애플리케이션의 로직을담기 위한예외는 체크 예외로 만든다 .
- JDBC의 SQLException은 대부분 복구할 수 없는 예외이므로 런타임 예외로 포장해야 한다
- SQLException의 에러 모드는 DB에 종속되기 때문에 DB에 독립적인 예외로 전환될 필요가
있다. - 스프링은 DataAccessException을 통해 DB에 독립적으로 적용 가능한 추상화된 런타임 예
외계층을 제공한다 . - DAO를 데이터 액세스 기술에서 독립시키려면 인터페이스 도입과 런타임 예외 전환, 기술
에 독립적인 추상화된 예외로 전환이 필요하다.
mycool0905
Metadata
Metadata
Assignees
Labels
No labels