프로그래머는 검사예외와 비검사예외 중 어느 것을 선택해야 할지 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)
댓글남기기