Java Error & Exception

u-nij·2022년 10월 13일
0
post-thumbnail

에러(Error)

  • 메모리가 부족하는 등과 같이 시스템이 비정상적인 상황인 경우에 사용
  • 주로 JVM에서 발생시키기 때문에 애플리케이션 코드에서 잡아서는 안되며, 잡아서 대응할 수 있는 방법도 없다.
  • 시스템 레벨에서 특별한 작업을 하는게 아니라면, 이러한 에러 처리는 하지 않아도 된다.

예외(Exception)

  • Error와 달리 애플리케이션 코드에서 예외가 발생하였을 경우에 사용된다.
  • Exception은 다시 체크 예외(Check Exception)와 언체크 예외(Uncheck Exception)로 구분된다.
  • 스프링 프레임워크가 제공하는 선언적 트랜잭션(@Transactional)안에서 에러 발생 시, 체크 예외는 롤백(Rollback)이 되지 않고, 언체크 예외는 롤백이 된다.

체크 예외(Check Exception)

  • RuntimeException 클래스를 상속받지 않은 예외 클래스들이다.
  • 체크 예외는 복구 가능성이 있는 예외이기 때문에, 반드시 예외를 처리하는 코드를 함께 작성해야 한다.
    • try catch :해당 메소드에서 처리
    • throw: 호출한 곳에서 처리하도록 상위로 넘김
  • 대표적으로 IOException, SQLException, ClassNotFoundException 등이 있으며, 예외를 처리하기 위해서는 catch 문으로 잡거나 throws를 통해 메소드 밖으로 던질 수 있다. 만약 예외를 처리하지 않으면 컴파일 에러가 발생한다.

언체크 예외(Uncheck Exception)

  • RuntimeException 클래스를 상속받는 예외 클래스들은 복구 가능성이 없는 예외들이므로 컴파일러가 예외처리를 강제하지 않는다. 그래서  언체크 예외라고 불리는데, 언체크 예외는 Error와 마찬가지로 에러를 처리하지 않아도 컴파일 에러가 발생하지 않는다.
  • 즉, 런타임 예외는 예상치 못했던 상황에서 발생하는 것이 아니므로 굳이 예외 처리를 강제하지 않는다.
  • RuntimeException에는 대표적 NullPointerException이나 IllegalArgumentException 등과 같은 것들이 있다. 

예외 처리 방법

예외 복구

  • 예외 상황을 파악하고, 문제를 해결해서 정상 상태로 돌려놓는 것이다.

예외 처리 회피

  • 예외 처리를 직접 처리하지 않고, 자신을 호출한 곳으로 던져버리는 것이다.
  • 해당 예외를 처리하는 것이 자신이 해야될 일이 아니라고 느껴진다면, 다른 메소드에서 처리하도록 넘겨줄 때 사용한다.

예외 전환

  • 예외 처리 회피와 마찬가지로, 예외를 복구할 수 없는 상황에 사용된다.
  • 예외 처리 회피와 다르게, 적절한 예외로 변환하여 던진다.
  • 목적
    • 의미 있고 추상화된 예외로 바꾸는 경우
      • 중복되는 ID로 회원 가입을 요청한 경우, SQLException이 발생한다. 이 에러를 그대로 던지면, 서비스 계층에서는 왜 예외가 발생한건지 파악하기 힘들기 때문에, DuplicatedUserIdException과 같은 예외로 바꿔서 던져 상황에 따른 복구 작업을 시도할 수 있게 한다.
    • 런타임 예외로 포장하여(언체크 예외로 변경하여) 불필요한 처리를 줄여주는 경우
      • 복구하지 못할 예외라면 불필요하게 체크할 필요가 없기 때문에, 애플리케이션 로직 상에서 런타임 예외로 포장하여 던지고, 자세한 로그를 남기거나 알림을 주는 등의 방식으로 처리한다.

참고

http://plus4070.github.io/nhn%20entertainment%20devdays/2017/01/22/Exception/
https://mangkyu.tistory.com/152

0개의 댓글