자바의 예외에는 위와 같은 종류로 나누어집니다
크게 Error와 Exception으로 나뉩니다.
- Error
에러는 시스템에 문제가 생겼을 때 발생합니다. 이는 프로그래머나 사용자가 수정할 수 없는 성격으로서 예로는 OutOfMemoryError, StackOverflowError 등이 있습니다. 이런 에러는 코드로 잡을 수 없는 상황이 많습니다.
- Exception
익셉션 클래스는 다시 RuntimeException(uncheck 예외)을 상속하는 Exception들과 그 외의 Exception(check 예외)으로 나뉩니다. 자바를 다루다 보면 자주 사용하는 코드들이 파일 인풋 아웃풋, DB 관련 코드일 텐데 이 부분을 구현하다보면 try, catch 로 묶거나 throw를 사용하여 에러를 던지는 경우를 자주 접했을 것입니다다. 이처럼 코드 상에서 충분히 수정이 가능하고. 대처가 가능한 코드들은 명시적인 예외처리를 강제하게끔 되어있습니다. 예외처리를 하지 않는다면 컴파일 에러가 납니다. 이러한 예외를 check 에러라고 합니다.
반대로 런타임 예외는 예외처리를 강제하지 않습니다. 즉 catch나 throws를 선언하지 않아도 컴파일 에러가 나지 않습니다. 런타임 예외는 일반적으로 시스템 장애나, 프로그램상의 오류에 사용하는 예외들입니다.
다음은 이러한 예외처리를 하는 방법에 대해 알아보겠습니다.
1. 예외 복구
int try = TRY_NUM;
while(try-- > 0) {
try {
// 시도
return; // 성공 시 리턴
}
catch (Exception e) {
// 로그, 에러 처리
}
finally {
// 리소스 반납, 정리
}
}
throw new RetryFailedException(); // 재시도 횟수 넘으면 예외 던짐
일반적으로 가장 많이 사용하는 방법일 것입니다. try에서 예외가 발생할 수 있는 코드를 진행하고
예외 발생시 catch문에서 처리, 복구 시도를 하는 방법입니다. finally는 성공, 실패의 두가지 경우 모두 실행되는 부분입니다.
예외 복구의 특성은 예외가 발생해도 정상적인 흐름으로 진행된다는 것입니다.
2. 예외 처리 회피
public void doit() throws Exception {
// ..
}
public void doit() throws Exception {
try {
// ..
} catch (Exception e) {
throw e;
}
}
예외 발생시 자기자신이 처리하지 않고, 자신을 호출한 쪽으로 예외를 던져버리는 회피 기법입니다.
전략 패턴과 같이 관계가 긴밀해서 예외처리를 책임지기 용이한 관계면 유용하게 사용할 수 있으나.
호출한 쪽과 호출당한 쪽의 관계가 긴밀하지 못한 경우에는 무책임한 선택이 될 수 있습니다.
3. 예외 전환
catch(SQLException e) {
// ...
throw PrimaryKeyException();
}
예외 전환은 예외를 잡아서 다른 예외로 바꾸어 던지는 방법입니다.
예외전환을 사용하는 목적은 일반적으로 두개가 있는데 하나는 호출한 쪽에 예외의 상황에 대해 적절한 의미를 전달해주지 못한다 판단될 때 입니다.
SQLException 은 DB 엑세스에 관한 여러 예외에 관한 상황에서 발생될 수 있는 포괄적인 예외입니다. 때문에 어떤 부분에 의해 예외가 발생했는지 판단하기 힘들 수 있기에, 구체적으로 기본키 관련 예외입니다. 라고 적절한 의미를 전달해 줄 수 있습니다.
위 코드에서는 호출한 쪽에서는 DuplicateUserIdException 예외만 받게됩니다.
SQLException 에 대한 정보까지 같이 전달하고 싶을 때에는 Exception 클래스를 수정해서
다음과 같은 방법들로 내부정보를 포함(wrap)해 에러를 보낼 수 있습니다.
throw PrimaryKeyException(e);
throw PrimaryKeyException().cause(e);
throw PrimaryKeyException("error text", SQLException);
'프로그래밍 > Java' 카테고리의 다른 글
이펙티브 자바 규칙 13 - 클래스와 멤버의 접근 권한은 최소화하라 (0) | 2018.02.10 |
---|---|
이펙티브 자바 규칙 12 - Comparable 구현을 고려하라 (0) | 2018.02.08 |
이펙티브 자바 규칙 10 - toString은 항상 재정의하자 (0) | 2018.02.06 |