ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 자바 예외 종류 및 Exception 처리
    Java 2023. 8. 13. 15:00

    Error와 Exception의 차이

    1. Error
      • 시스템에 비정상적인 상황이 생겼을 때 발생한다.
      • 개발자가 미리 예측이 어렵다.
    2. Exception
      • 개발자가 구현한 로직에서 발생한다.
      • Exception이 발생할 상황을 예측해 처리할 수 있다.

     

     

    Exception 클래스의 구조

    • 모든 예외 클래스는 Throwable 클래스를 상속받고 있다.
    • RuntimeException은 CheckedException과 UnCheckedException을 구분하는 기준이다.
    • RuntimeException을 제외한 모든 클래스는 CheckedException이다.
    • CheckedException
      • 반드시 예외 처리를 해야한다.
      • 컴파일 단계에서 확인이 가능하다.
      • 롤백을 하지 않는다.
      • IOException, SQLException, ClassNotFoundException이 존재한다.
      • try/catch로 감싸고 throw로 던져 처리한다.
    • UnCheckedException
      • 명시적인 처리를 강제하지 않음
      • 실행단계에서 확인이 가능하다.
      • 롤백을 한다.
      • NullPointerException, IndexOutBoundException, SystemException이 존재한다.
      • 순수 자바 관점에서는 롤백을 하지 않아도 된다.

    Exception

     

     

    Exception 처리 방법

    1. 예외 복구

    for (int i = 3; i > 0; i--) {
        try {
            // code.... // 예외가 발생
            return; 	// 예외 발생이 없으면 리턴
        } catch (Exception e) {
            // 로그 출력 및 일정 시간만큼 대기
        } finally {
            // 리소스 반납 및 정리
        }
    }
    throw new CustomException(); // 예외 복구 실패 시, 직접 예외 발생

     

    • 예외가 발생해도 정상적인 흐름으로 진행된다.
    • 예외가 발생하면 일정시간 만큼 재시도를 통해 정상적인 흐름으로 만들거나, 예외를 미리 예측해 다른 흐름으로 유도시키도록 구현하면 예외가 발생해도 정상적인 작업이 가능하다.

     

    2. 예외 처리 회피

    // 예시 1
    public void exceptionTest() throws Exception {
        // code....
    }
    
    // 예시 2	
    public String exceptionTest() throws Exception {
        try {
            // code.... // 예외가 발생
            return "success"; 	
        } catch (Exception e) {
            throw e; 	// 예외 날린다.
        }
    }

     

    • throws를 통해 호출한 쪽으로 예외를 던진다.
    • 2가지 경우에 예외 처리 회피 방법을 사용한다.
      1. 호출한 쪽에서 다시 예외를 받아 처리하도록 한다.
      2. 예외를 던지는 것이 최선의 방법이다.

     

    3. 예외 전환

    // 조금 더 명확한 예외로 던진다.
    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);
        }
    }
    • 예외를 잡아서 다른 예외로 던지는 것
    • 호출한 쪽에서 예외를 받아 처리할 때, 명확하게 인지할 수 있도록 돕는 방법
    • checkException 예외가 복구가 안되면 UnCheckedException으로 전환해 사용한다.

     

     

    출처)

    https://www.nextree.co.kr/p3239/
    https://cocobi.tistory.com/146

Designed by Tistory.