자바로 프로그래밍을 하면서 제대로 예외처리를 시행한 적이 없다. try - catch 문으로 해당 에러 발생 블록을 감싸고, 이후에 catch 문에는 항상 e.printStackTrace(); 라는 구문만 기입했다. 


catch 블록을 이용해 화면에 메시지를 출력한 것은 예외 처리를 수행한 것이 아니다.


모든 예외처리는 반드시 지켜야 할 핵심 원칙이 존재한다. 모든 예외는 발생하는 경우 적절한 처리 및 복구 혹은 작업을 중단하고 개발자에게 통보되어야 한다는 사실이다.


만약 예외를 조치할 방법이 없다면 throws를 이용해서 메소드 밖으로 던지고, 자신을 호출한 코드에 예외처라 책임을 전가하는 방법도 있다. 하지만 throws를 남발하게 되어 모든 예외를 던져버리는 것은 매우 무책임한 예외처리 방식이다.



예외의 종류와 특징

자바에서는 throw를 통해 발생시킬 수 있는 예외는 크게 세가지로 구분한다.

  • Error
    java.lang.Error 클래스의 서브클래스들이다. 에러는 비정상적인 상황이 발생했을 경우에 사용된다. 그래서 애플리케이션 코드에서 해결하려고 하면 안된다. 시스템 레벨에서 특별한 작업을 하는 것이 아니라면 애플리케이션에서는 이런 에러에 대한 처리는 신경 쓰지 않아도 된다.

  • Exception과 체크 예외
    java.lang.Exception 클래스와 그 서브클래스로 정의되는 예외들은 에러와 달리 개발자들이 만든 애플리케이션 코드의 작업 중에 예외상황이 발생했을 경우에 사용된다. Exception 클래스는 다시 checkExceptionunCheckException 으로 구분된다. unCheckException 은 RuntimeException 을 상속한 클래스들을 말한다. RuntimeException은 Exception의 서브클래스이므로 Exception 의 일종이지만 자바는 RuntimeException을 특별하게 취급한다. 

    일반적인 자바에서 예외는 RuntimeException을 상속받지 않은 것들을 말하기 때문에 해당 예외에는 반드시 예외를 처리하는 코드를 함께 작성해야 한다.

  • RuntimeException과 언체크/런타임 예외
    java.lang.RuntimeException 클래스를 상속한 예외들은 명시적인 예외처리를 강제하지 않기 때문에 언체크 예외라고 부른다. 혹은 런타임 에러라고 부르기도 한다. 주로 NullPointerException 이나 IllegalArgumentException 등이 있다.


예외처리 방법
  • 예외복구
    - 예외상황을 파악하고 문제를 해결해서 정상상태로 돌려놓는 것.
  • 예외처리 회피
    - 예외처리를 담당하지 않고 자신을 호출한 메소드로 던지는 것. throws 문으로 선언해서 예외가 발생하면 알아서 던져지게 하거나 혹은 catch문으로 일단 예외를 잡은 후에 로그를 남기고 다시 예외를 rethrow 하는 것. 
  • 예외전환
    - 예외처리 회피와 유사하지만, 발생한 예외를 그대로 넘기는 것이 아닌 적절한 예외로 전환해서 던진다는 것이 특징이다.


[ 참고링크 및 서적 ]


[ 토비의 스프링 3.1 ]


Posted by doubler
,