반응형

 

 

📌 자바 예외처리 방법과 종류

java exception handling (Checked Exception, Unchecked Exception)

 

 

 

 

0️⃣ 예외와 에러의 의미 

예외(Exception)란 입력 값에 대한 처리가 불가능하거나, 프로그램 실행 중에 참조된 값이 잘못된 경우 등 정상적인 프로그램의 흐름을 어긋나는 것을 말한다. 또한, 자바에서의 예외는 개발자가 직접 처리할 수 있기 때문에 예외 상황을 미리 예측하여 다룰 수 있다.

 

에러(Error)시스템에 비정상적인 상황이 발생한 경우를 말한다. 주로 자바 가상 머신(JVM)을 통해 발생되며 예외와 반대로 이를 애플리케이션 코드에서 잡으려고 하면 안 된다.

 

package src.throwable.error;

public class ErrorExample {

    public static void gillog(String log) {
        System.out.println(log);
    }

    public static void main(String[] args) {
        try {
            gillog("Error Test");
        } catch (StackOverflowError e) {
            // ......... :(
        }
    }
}

에러의 경우 StackOverflowError에 대해 Catch를 하려 해도 처리할 수 없다.

 

 

 

1️⃣ 예외(Exception)의 구분

RuntimeException을 상속하지 않는 클래스는 Checked Exception로 분류할 수 있고,

RuntimeException을 상속하는 클래스는 Unchecked Exception으로 분류할 수 있다.

 

 

 

2️⃣ 에러(Error)의 종류

에러의 종류에는 LinkageError, ThreadDeath, AssertionError, VirtualMachineError가 있다.

종류 설명
LinkageError 어떤 클래스가 다른 클래스에 대한 종속성이 있는 상황에서,
후자 클래스가 이전 클래스를 컴파일 한 후 비호환적으로 변경된 경우 발생하는 Error이다.
ThreadDeath 더 이상 사용되지 않는 Thread에 대해 Thread.stop() method가 호출 될 때,
삭제되는 Thread에서 Instance가 throw 되며 발생하는 Error이다.
AssertionError Assertion이 실패한 경우 발생하는 Error이다.
Assertion : 해당 지점에서 개발자가 반드시 참(true)이어야 한다고 생각하는 사항을 표현한 논리식
_[EX] assert [boolean]; assert [boolean] : [표현식];
VirtualMachineError JVM이 손상되었거나 계속 작동하는 데 필요한 리소스가 부족할때 발생하는 Error

 

 

 

3️⃣ CheckedException과 UncheckedException

 

💡 CheckedException 

  ◽ CheckedException은 반드시 예외 처리해야 하며, 컴파일 시점에서 예외 발생이 확인된다.

  ◽ CheckedException은 Error와 RuntimeException을 상속하지 않은 예외들을 모두 포함한다.
  ◽ Error, FileNotFoundException, ClassNotFoundException 등이 대표적이다.

  ◽ 스프링 프레임워크에서 CheckedException은 트랜젝션 처리 시에 예외가 발생해도 롤백하지 않는다.

 

 

💡 UncheckedException

  ◽ UncheckedException은 명시적으로 예외 처리할 필요가 없으며, 런타임 시점에서 예외 발생이 확인된다.

  ◽ UncheckedException은 RuntimeException을 상속받는 예외들을 포함한다.
  ◽ NullPointerException, ClassCastException 등이 대표적이다.

  ◽ 스프링 프레임워크에서 UncheckedException은 트랜젝션 처리시에 예외가 발생한 경우 롤백을 수행한다.

 

💥 순수 자바 관점에서의 UncheckedException 상황에서는 롤백을 수행하지 않아도 된다.(스프링과 다름)

참고 영상 : https://www.youtube.com/watch?v=_WkMhytqoCc 

 

 

 

4️⃣ 예외처리 방법

예외 처리 방법에는 복구, 회피, 전환 이 있다.

 

🏳‍🌈 예외 복구

  • 예외 상황을 파악하고 문제를 해결해서 정상 상태로 돌려놓는 방법
  • 예외를 잡아서 일정 시간, 조건만큼 대기하고 다시 재시도를 반복한다.
  • 최대 재시도 횟수를 넘기게 되는 경우 예외를 발생시킨다.
final int MAX_RETRY = 100;
public Object someMethod() {
    int maxRetry = MAX_RETRY;
    while(maxRetry > 0) {
        try {
            ...
        } catch(SomeException e) {
            // 로그 출력. 정해진 시간만큼 대기한다.
        } finally {
            // 리소스 반납 및 정리 작업
        }
    }
    // 최대 재시도 횟수를 넘기면 직접 예외를 발생시킨다.
    throw new RetryFailedException();
}

 

 

🏳‍🌈 예외처리 회피

  • 예외 처리를 직접 담당하지 않고 호출한 쪽으로 던져 회피하는 방법
  • 그래도 예외 처리의 필요성이 있다면 어느 정도는 처리하고 던지는 것이 좋다.
  • 긴밀하게 역할을 분담하고 있는 관계가 아니라면 예외를 그냥 던지는 것은 무책임하다.
// 예시 1
public void add() throws SQLException {
    // ...생략
}

// 예시 2 
public void add() throws SQLException {
    try {
        // ... 생략
    } catch(SQLException e) {
        // 로그를 출력하고 다시 날린다!
        throw e;
    }
}

 

 

🏳‍🌈 예외 전환

  • 예외 회피와 비슷하게 메서드 밖으로 예외를 던지지만, 그냥 던지지 않고 적절한 예외로 전환해서 넘기는 방법
  • 조금 더 명확한 의미로 전달되기 위해 적합한 의미를 가진 예외로 변경한다.
  • 예외 처리를 단순하게 만들기 위해 포장(wrap) 할 수도 있다.
// 조금 더 명확한 예외로 던진다.
public void add(User user) throws DuplicateUserIdException, SQLException {
    try {
        // ...생략
    } catch(SQLException e) {
        if(e.getErrorCode() == MysqlErrorNumbers.ER_DUP_ENTRY) {
            throw DuplicateUserIdException();
        }
        else throw e;
    }
}

// 예외를 단순하게 포장한다.
public void someMethod() {
    try {
        // ...생략
    }
    catch(NamingException ne) {
        throw new EJBException(ne);
        }
    catch(SQLException se) {
        throw new EJBException(se);
        }
    catch(RemoteException re) {
        throw new EJBException(re);
        }
}

 

 

 

 

 

 

 

📌 참고사이트

https://madplay.github.io/post/java-checked-unchecked-exceptions

 

 

 

반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기