https://kdhyo98.tistory.com/30
트랜잭션에 대해 공부하다보니 예외를 빼놓을 수 없어서 한 번 정리한다.
예외는 크게 두 종류로 나뉘게 된다.
Checked Exception 와 Unchecked Exception 그리고 예외와 별개로 오류(Error)가 있다.
예외란 개발자가 로직을 잘못 짰거나 혹은 사용자가 잘못된 값을 넘겨 정상적인 프로그램 흐름에 벗어나는 행위를 말한다. 그래서 미리 예측을 하여 예외를 잡을 수 있다.
오류는 하드웨어에서 문제가 발생하는 경우도 있고, 완전 잘못된 로직을 짠 경우 등 시스템 레벨에서 발생하는 비정상적인 행위이기 때문에 이를 미리 예측해서 막을 수도 신경을 쓸 필요도 없다.
간단하게 설명하자면
RuntimeException 를 상속받는 예외는 Unchecked Exception 이며,
반대는 Checked Exception를 의미한다.
예외 | Checked Exception | Unchecked Exception |
---|---|---|
정의 | Exception의 상속받는 하위 클래스 중 RuntimeException을 제외한 모든 Exception | RuntimeException을 상속받는 모든 Exception |
처리여부 | 필수 | 생략가능 (필요에 따라 처리) |
확인시점 | Compile Time 이미 컴파일 시점 에러가 표시되기 때문에 확인하여 예외처리를 할 수 있다. | Run Time 컴파일 이후 런타임 도중 예외를 확인할 수 있다. 따라서 로직상에서는 생략은 가능하지만 미리 막아두는 것이 좋다. |
트랜잭션 여부 | 예외 발생 시 롤백(rollback)을 진행하지 않음 | 예외 발생 시 롤백(rollback)진행 |
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("무조건 실행");
}
작성된 코드가 있는 메소드 안에서 직접적으로 예외처리를 해주는 방식입니다.
public void add() throws Exception {
// 로직 작성
}
이 메소드 내에서 직접 에러를 처리 하지 않고, 해당 메소드를 호출한 쪽으로 예외처리를 던져 호출한 쪽에서 예외처리를 하게 회피하는 방식이다.
public void add() throws Exception {
throw new Exception("예외처리 발생!");
}
이 방식은 강제로 예외처리를 발생하는 방법이다.
예외에 대해 배웠으니 이젠 예외처리 방식에 대해 어떤 방식이 나을 지 생각을 하고,
에러와 예외가 발생 시 어떤 상황인지 빠르게 파악해서 해결방안을 찾고,
필요에 따라 예외를 직접 발생시켜 개발자에게 알려줄 수 있도록 생각하면서 코딩을 할 수 있다.
참고
https://www.nextree.co.kr/p3239/
https://qh5944.tistory.com/32
https://interconnection.tistory.com/122
https://madplay.github.io/post/java-checked-unchecked-exceptions