Skip to content

4장 예외 #4

@leegw217

Description

@leegw217

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를 데이터 액세스 기술에서 독립시키려면 인터페이스 도입과 런타임 예외 전환, 기술
    에 독립적인 추상화된 예외로 전환이 필요하다.

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions