예외 (Exception) 간단 정리

2023. 1. 29. 21:34JAVA

1/29

 

트랜잭션에 대해서 공부하기 위해서 예외 관련해서 간단하게 정리하려고 한다.

 

* Checked Exception / Unchecked Exception

 

 

* Checked Exception -> RuntimeException 을 상속받지 않은 예외

 - Compile 오류 O

 - 예외 발생 시 롤백X

 - 반드시 throws 예외를 처리해야 한다.

 - ex) SQLException, IOExeption, FileNotFoundException 등

 

* Unchecked Exception -> RuntimeException 을 상속받은 예외

 - Compile 오류 X

 - 예외 발생 시 롤백O

 - 명시적인 처리를 강제하지 않는다. (throws 굳이 안 써도 된다.)

 - NullPointException, IndexOutOfBoundException, IllegalArgumentException 등

 

 

 

*** 예외처리 방식

 

1.  try-catch finally 직접 처리

try {
    // 예외처리로 감쌀 로직 작성
} catch (NumberFormatException e) {
    System.out.println("정수변환이 안됨");
} catch (ArrayIndexOutOfBoundsException e) {
    System.out.println("배열 범위가 벗어난경우");
} catch (ArithmeticException e) {
    System.out.println("0 으로 나눌경우");
} catch (RuntimeException e) { // 예상 못했던 에러 => 처리
    System.out.println("실행시 모든 에러를 처리");
} catch (Exception e) { // Exception
    System.out.println("수정이 가능한 모든 에러를 처리");
} catch (Throwable e) { // error, Exception 둘 다 처리 가능
    System.out.println("예외와 에러를 동시 처리");
} finally {
    System.out.println("무조건 실행");
}

 

2. throws 간접 처리

public void add() throws Exception {
    // 로직 작성 
}

 

3. throws 예외 발생

public void add() throws Exception {
    throw new Exception("예외처리 발생!");
}

 

 

* 체크 예외의 문제점 (Web 프로젝트의 경우)

-> 처리할 수 없는 예외인 경우에는 계속해서 throws 를 던진다.

-> 그럼 예외로 계속 의존관계가 생성된다.

-> 하부 구현 기술이 바뀌면 예외처리도 전부 다 바꾸어야 한다.

-> 런타임 오류로 바꿔서  사용하자.

 

* 예외로 의존관계가 생성된 구조 (하부 구현 기술이 바뀌어서 예외 처리도 모두 변경해줘야 되는 예시)

 

*예외 전환시 주의할 점

 

 - 반드시 기존 예외를 포함해줘야 한다.

ublic void call() {
    try {
        runSQL();
    } catch (SQLException e) {
        throw new RuntimeSQLException(e); //기존 예외(e) 포함
    }
}

 

* 예외 출력

- 로그 출력시 마지막 파라미터에 예외를 넣어주면 로그에 스택 트레이스를 출력할 수 있다.

ex) log.info("message={}", "message", ex)

      log.info("ex", ex)