티스토리 뷰
예외의 종류와 특징
Error
java.lang.Error 클래스의 서브클래스들
시스템에 뭔가 비정상적인 상황이 발생했을 경우 사용됨
ex) OutOfMemoryError, ThreadDeath
Exception
java.lang.Exception 클래스와 그 서브클래스들
개발자들이 만든 애플리케이션 코드의 작업 중에 예외상황이 발생했을 경우 사용
체크 예외 CheckedException
- RuntimeException 클래스를 상속하지 않은 예외들
- try/catch, throws를 사용하여 반드시 예외처리를 해야 함. 그렇지 않으면 컴파일 에러 발생
언체크 예외 UncheckedException
- RuntimeException을 상속한 예외들
- try/catch, throws로 처리하지 않아도 상관없음
- ex) NullPointerException, IllegalArgumentException 등
예외처리 방법
예외 복구
예외 상황을 파악하고 문제를 해결해서 정상 상태로 돌려놓는 것
ex) 파일 읽기 요청 처리 중 IOException 발생 시 다른 파일을 이용하도록 사용자에게 안내
ex) DB 접속 실패하여 SQLException 발생 시 재시도 처리
int maxRetry = 5;
while(maxRetry-- > 0) {
try {
// 예외가 발생할 가능성이 있는 로직
return; // 성공
} catch (SomeException e) {
// 로그 출력. 정해진 시간만큼 대기
} finally {
// 리소스 반납. 작업 정리
}
}
throw new RetryFailedException(); // 최대 재시도 횟수 넘기면 직접 예외 발생
예외처리 회피
예외처리를 자신이 담당하지 않고 자신을 호출한 쪽으로 던져버리는 것
예외를 잡아서 아무런 조치를 취하지 않거나 의미 없는 throws 선언을 남발하는 것은 위험하다. 예외를 회피하는 것은 예외를 복구하는 것처럼 의도가 분명해야 한다
public void add() throws SQLException { ... }
예외 전환 (exception translation)
발생한 예외를 적절한 예외로 전환해서 던지는 것
1. 상황의 분명한 의미를 가진 다른 예외로 변경
ex) JDBC에서 duplicated key error로 인해 SQLException 발생 시, DuplicatedUserIdException과 같은 예외로 변경
public void add(User user) throws DuplicatedUserIdException, SQLException {
try {
// ...
} catch (SQLException e) {
if (e.getErrorCode() == MySqlErrorNumbers.ER_DUP_ENTRY) {
throw DuplicatedUserIdException(e); // 중첩 예외 (nested exception)
} else {
throw e;
}
}
}
2. 런타임 예외로 포장
예외처리를 강제하는 체크 예외를 언체크 예외인 런타임 예외로 바꾸는 것
불필요한 catch/throws를 피할 수 있음
try {
OrderHome orderHome = EJBHomeFactory.getInstance().getOrderHome();
Order order = orderHome.findByPrimaryKey(id);
} catch (NaminingException ne) {
throw new EJBException(ne);
} catch (SQLException se) {
throw new EJBException(se);
} catch (RemoteException re) {
throw new EJBException(re);
}
참고
https://product.kyobobook.co.kr/detail/S000000935358
토비의 스프링 3.1 Vol 1: 스프링의 이해와 원리 | 이일민 - 교보문고
토비의 스프링 3.1 Vol 1: 스프링의 이해와 원리 | 대한민국 전자정부 표준 프레임워크 스프링을 설명하는 No. 1 베스트셀러! 단순한 예제를 스프링 3.0과 스프링 3.1의 기술을 적용하며 발전시켜 나
product.kyobobook.co.kr
'Java, Spring' 카테고리의 다른 글
[스프링 AOP] 데코레이터 패턴, 프록시 패턴, 다이내믹 프록시 (0) | 2025.05.24 |
---|---|
[토비의 스프링] 서비스 추상화 - 트랜잭션 (0) | 2025.04.20 |
Spring Framework 6에 추가된 HandlerMethodValidationException (0) | 2025.04.11 |
[스프링] 템플릿/콜백 패턴 (0) | 2025.04.09 |
[토비의 스프링] 테스트 (0) | 2025.04.07 |
- Total
- Today
- Yesterday
- 샤딩
- 분산처리
- mongoDB
- Infra
- AOP
- springboot
- php
- mockery
- Spring
- laravel 테스트코드
- 라라벨
- devops
- Container
- index
- 스프링
- 쿠버네티스
- 카프카
- docker
- database
- JUnit
- kubernetes
- 대규모 데이터 처리
- 몽고디비
- laravel
- NoSQL
- k8s
- kafka
- phpUnit
- MySQL
- java
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |