프로그래머는 검사예외와 비검사예외 중 어느 것을 선택해야 할지 API 설계 및 분석을 잘 해야 한다.

Checked Exception

  • 검사 예외
  • 장점
    • 제대로 활용하면 API와 프로그램의 질을 높일 수 있다.
    • 발생한 문제를 프로그래머가 직접 처리하여 안전성을 높이게끔 해준다.
  • 단점
    • 과하게 사용하면 오히려 쓰기 불편해진다
    • 메서드가 단 하나의 검사 예외만 던질 때 부담이 크다.
      • 예시) 단 하나의 예외 때문에 try-catch 블록을 추가해야 함
  • 사용방법 : try~catch 구문으로 예외를 붙잡아 처리하거나 더 바깥으로 던져 문제를 전파해야 한다.
    하지만 해당 방법은 스트림 안에서 직접 사용할 수 없기 때문에 부담이 크다.

검사 예외 회피 방법

1. Optional 반환

  • 검사 예외를 던지는 대신 빈 옵셔널을 반환
  • 단점
    • 예외 발생 이유를 알려주는 부가 정보를 담을 수 없다.

2. 메서드(throws checkedException)를 2개로 쪼개기

// 리펙토링 전 메서드
try {
	obj.action(args);
} catch (TheCheckedExcpetion e) {
	// ...
}


// 리펙토링 후 메서드
if(obj.actionPermitted(args)) {
	obj.action(args);
} else {
	// ...
}
  • 리팩토링 후 메서드처럼 검사 예외를 던지는 메서드를 2개로 쪼개 비검사 예외로 바꿀 수 있다.
  • 실패 시 스레드를 중단하길 원한다면 obj.action(args) 처럼 해도 된다.
    하지만, actionPermitted는 상태 검사 메서드이므로 단점이 있다는 것을 주의하자.

상태 검사 메서드 단점
외부 동기화 없이 여러 스레드가 동시에 접근할 수 있거나 외부 요인에 의해 상태가 변할 수 있음
따라서 이런 경우, 옵셔널이나 특정 값으로 리팩토링하자! (참고: item 69)

Unchecked Exception

  • 비검사 예외
  • 프로그래머가 의미 있는 조취를 취할 수 있는 상황이 아닌 경우 사용하는 것이 좋다.

Checked Exception vs Unchecked Exception

| . | Checked Exception | Unchecked Exception |
|:—:|:—-:|:—-:|
| 처리 여부 | 반드시 예외 처리 해야함 | 예외 처리 하지 않아도 됨 |
| 트랜잭션 Rollback 여부 | X | O |
| 대표 Exception | IOException, SQLException | NullPointerException, IllegalArgumentException |

  • Unchecked Exception
    • 명시적인 예외 처리를 강제하지 않는 특징이 있음
    • catch로 잡거나 throw로 호출한 메서드로 예외를 던지지 않아도 상관이 없음
    • JPA에 구현체를 가져다 사용하더라도 내부적으로 적절한 RuntimeException으로 예외를 던져주고 있기 때문에 직접 처리하지 않아도 됌
  • Checked Exception
    • 반드시 명시적으로 처리해야 함
    • try~catch로 에러를 잡던 throws를 통해서 예외를 던져야 함
    • 개발자가 직접 복구 작업을 해야 함(roll back)

댓글남기기