예외

CHEESE·2021년 10월 27일
0

예외

자바에서 throw를 통해 발생시킬 수 있는 예외는 크게 3가지가 있다.

  • Error
  • 체크 예외
  • RuntimeException과 언체크/런타임 예외

Error

java.lang.Error 클래스의 서브 클래스들
주로 자바 VM에서 발생시킨다.
OutOfMemoryError나 ThreadDeath와 같은 에러는 catch 블록으로 잡아도 코드에서 대응할 수 있는 방법이 없다.

=> 시스템 레벨에서 특별한 작업을 하지 않는다면 애플리케이션에서는 신경쓰지 않아도 된다.

체크 예외

Exceptionjava.lang.Exception 클래스와 서브클래스로 정의된 것을 말한다.
ExceptionRuntimeException 클래스를 상속하지 않은 체크 예외와 상속한 언체크 예외로 구분된다.

체크 예외는 catch 또는 throws 를 사용하지 않으면 컴파일 에러가 발생한다.

=> 체크 예외가 발생할 수 있는 메소드를 사용할 경우 반드시 예외를 처리하는 코드를 함께 작성해야 한다.

RuntimeException과 언체크/런타임 예외

java.lang.RuntimeException 클래스를 상속한 예외들은 명시적인 예외처리를 강제하지 않는다.
주로 프로그램의 오류가 있을 때 발생하도록 의도된 것들이다.
(NullPointerException, IllegalArgumentException 등)

=> 런타임 예외는 개발자가 부주의해서 발생할 수 있는 경우에 발생하도록 만들어졌다.

요즘은 ?

체크 예외가 예외처리를 강제하기 때문에 예외 블랙홀이나 무책임한 throws 코드가 남발된다. 그래서인지 새로 등장하는 자바 표준 스펙 API는 예상 가능한 예외상황을 다루는 예외를 체크 예외로 만들지 않는 경향이 있다.

예외 처리 방법

예외 복구

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

예외처리 회피

다른 오브젝트나 메소드가 예외를 대신 처리할 수 있도록 던진다.
콜백 - 템플릿처럼 긴밀하게 역할을 분담하고 있는 관계가 아니라면 무책임한 책임 회피가 될 수 있으니 조심한다.

  • throws문으로 선언해서 예외가 발생하면 알아서 던져지게 한다.
  • catch문으로 예외를 잡아서 로그를 남기고 다시 예외를 던진다.

예외 전환

예외를 메소드 밖으로 던지는 것은 예외처리 회피와 동일하나, 예외를 그대로 넘기는 것이 아니라 적절한 예외로 전환해서 던진다.

  • 내부에서 발생한 예외를 그대로 던지는 것이 적절한 의미를 부여하지 못하는 경우
  • 체크 예외를 런타임 예외로 바꾸는 경우

0개의 댓글