[JAVA] Exception 정리

JAVA Exception 정리


1. 예외란?(Error vs Exception)

  • 먼저 오류(Error)와 예외(Exception)의 개념을 정리하고 넘어가자

오류(Error)

  • java.langError 클래스의 서브 클래스들이다
  • 시스템에 비정상적인 상황이 생겼을 때 발생한다.
    • 주로 VM이 발생시킨다
    • 이는 시스템 레벨에서 발생하기 때문에 심각한 수준의 오류
  • 따라서 개발자가 미리 예측하여 처리할 수 없기 때문에, 애플리케이션에서 오류에 대한 처리를 신경 쓰지 않아도 된다
    • OutofMemoryError나 ThreadDeath같은 에러는 catch로 잡아봤자 대응 방법이 없다

예외(Exception)

  • 개발자가 구현한 로직에서 발생한다.
  • 발생할 상황을 미리 예측하여 처리 할 수 있다
  • 예외는 개발자가 처리할 수 있기 때문에 예외를 구분하고 그에 따라 처리방법을 명확히 알고 있는것이 중요함


2. 예외 클래스

예외 클래스의 구조
  • 모든 예외 클래스는 Throwable 클래스를 상속받고 있으며, Throwable은 최상위 클래스 Object의 자식 클래스이다
  • Throwable을 상속받는 클래스는 Error와 Exception이 있다. Error는 시스템 레벨의 심각한 수준의 에러이기 때문에 시스템에 변화를 주어 문제를 처리해야 함
    • 반면에 Exception은 개발자가 로직을 추가하여 처리 할 수 있음
  • Excpetion은 수많은 자식 클래스를 가지고 있다.
  • 그 중 RuntimeException에 주목해야 함
  • RuntimeException은 CheckedException과 UncheckedException을 구분하는 기준
  • Exception의 자식 클래스 중 RuntimeException을 제외한 모든 클래스는 CheckedException
  • RuntimeException과 그의 자식 클래스들을 Unchecked Exception이라 부름

3. Checked Exception과 Unchecked(Runtime) Exception

롤백: 데이터 베이스에서 업데이트가 발생할 때, 이전 상태로 되돌리는 것
  • CE와 UE의 가장 명확한 기준은 "꼭 처리를 해야 하느냐"이다
  • CE이 발생할 가능성이 있는 메소드라면 반드시 로직을 try/catch로 감싸거나 throw로 던져서 처리해야 함
  • 반면 UE는 명시적인 예외처리를 하지 않아도 된다.
    • UE는 피할 수 있지만 개발자가 부주의해서 발생하는 경우가 대부분
    • 미리 예측하지 못했던 상황에서 발생하는 예외가 아니기 때문에 굳이 로직으로 처리할 필요가 없음


4. 예외 처리 방법

예외 처리 방법 위의 그림 처럼 3가지가 있다
  1. 예의가 발생하면 다른 작업 흐름으로 유도하는 예외 복구
  2. 처리를 하지 않고 호출한 쪽으로 던져버리는 예외 처리 회피
  3. 호출한 쪽으로 던질 때 명확한 의미를 전달하기 위해 다른 예외로 전환하여 던지는 예외 전환

4.1. 예외 복구


  • 예외 복구의 핵심은 예외가 발생하여도 애플리케이션은 정상적인 흐름으로 진행
  • 위의 그림은 재시도를 통해서 예외를 복구하는 코드

4.2. 예외처리 회피

  • 예외가 발생하면 throws를 통해 호출한쪽으로 예외를 던지고 그 처리를 회피
    • 하지만 무책임하게 던지는 것은 위험
  • 호출한 쪽에서 다시 예외를 받아 처리하도록 하거나, 해당 메소드에서 이 예외를 던지는 것이 최선의 방법이라는 확신이 있을때만 사용


4.3 예외 전환

  • 예외를 잡아서 다른 예외를 던지는 것
  • 호출한 쪽에서 예외를 받아서 처리할 때 좀 더 명확하게 인지할 수 있도록 돕기 위한 방법
  • 어떤 예외인지 분명해야 처리가 수월해지기 때문


+ 초급 계발자가 하지 말아야 할 것
  • 예외를 잡고 아무 처리도 하지 않는 것은 정말 위험
    • ex) try/catch문으로 예외를 잡아놓고 catch를 비워두면 물론 컴파일 오류가 나지는 않겠지만, 예외가 발생했을 때 그 원인을 파악하기가 어려움
출처













댓글

이 블로그의 인기 게시물

[Python] # -*- coding: utf-8 -*-를 쓰는 이유

[소프트웨어공학] NS(Nassi-Schneiderman) 차트

[컴퓨터네트워크] Telnet이란?