728x90
반응형
지난번 에러와 예외의 차이를 확인했고
이번에는 올바른 예외처리 방법을 알아보려고 한다.
예외처리 방법
예외복구
예외상황을 파악하고 문제를 해결해서 정상 상태로 돌려놓는 것
ex) 사용자의 요청으로 파읽을 읽으려고 시도 했을때 해당 파일이 없어 IOException이 발생했을떄
=> 사용자에게 상황을 알려주고 다른 파일을 이용하도록 안내해서 예회상황을 해결
=> IOException 메세지가 사용자에게 그냥 던져지는것은 예외 복구라고 볼 수 없다.
//Sample1 : 재시도를 통해 예외를 복구하는 코드
int maxTry = MAX_RETRY;
while(maxretry --> 0 ){
try{
..... //예외처리가 발생할 가능성이 있는 코드
return;
}catch(SomeException e){
//로그출력등 예외처리
}finally{
//리소스 반납, 정리;
}
}
throw new RetryFailedException(); //최대 재시도를 넘기면 직접 예외 발생
예외처리 회피
예외처리를 본인이 담땅하지 않고 자신을 호출한 쪽으로 던져버리는 것
역할이 분담이 되어있어서 예외처리하는것이 메서드의 역할이 아니라면 자신을 호출하는 쪽으러 던져버릴 수 있다.하지만 무작정 예외를 넘겨주는 것은 무책임한 회피가 될 수 있으므로 상황에 따라 적절하게 사용해야 한다.
public void add() throws SQLException{
try{
//JDBC API
}catch(SQLException e){
//로그 출력
throw e;
}
}
예외전환
예외를 복구 할 수 없는 상황에서 사용되며, 예외처리 회피와 다르게 적절한 예외로 변환해서 던진다.
- 내부에서 발생한 예외를 그대로 던지는 것이 예외상황에 대해 적절한 의미를 부여해주지 못할때 의미를 분명하게 해줄 예외르 바꿔주기 위해 사용됨(의미 있고 추상화된 예외로 바꾸는 경우)
publc void add(User user) throws DuplicateUserIdException, SQLException{
try{
// DB에 사용자를 추가하는 코드
// 아이디가 중복되어서 SQL에러가 발생할 수 있는 가능성이 있음
}catch(SQLException e){
// 에러코드가 MysqlErrorNumber.ER_DUP_ENTRY 일경우 이면 예외 전환
if( e.getErrorCode() == MysqlErrorNumber.ER_DUP_ENTRY ){
throw DuplicateUserIdException();
}else{
throw e;
}
}
}
- 예외를 처리하기 쉽고 단순하게 만들기 위해 포장할때 사용됨(런타임 예외로 포장하여 불필요한 처리를 줄여주는 경우
=> 체크 예외에 의해 불필요한 예외처리가 많아진다면 런타임예외(언체크예외) 로 변경하여 불필요한 처리를 줄일 수 있다.
=> 복구하기 못할 예외라면 불필요하게 체크할 필요가 없기 때문이다.
=> 그래서 런타임예외로 포장(변경)하여 던지고, 자세한 로그를 남기거나 알림등의 방식으로 처리할 수 있다.
반응형
'Dev > Java' 카테고리의 다른 글
AOP 개인 저장용 (0) | 2022.12.28 |
---|---|
Java reflection Sample Code (0) | 2022.12.16 |
에러(error)와 예외(Exception)의 차이 (0) | 2022.11.12 |
JNDI, JDBC, DBCP (0) | 2022.10.03 |
Java 컴파일 (1) | 2022.10.03 |