Exceptions (예외)
Exception은 프로그램의 실행 중에 발생하는 기대하지 않았던 이벤트. 프로그램의 정상적 실행을 방해한다.
exception이 발생하는 원인은 다양하다:
- 코드 에러
- 잘못된 입력
- 유효하지 않은 파일 접근
- 네트워크 연결 오류
- 물리적인 제한 (디스크 메모리의 부족)
exception(예외)는 처리가 가능하다.
Error(오류)
Error는 시스템에 비정상적인 상황이 생겼을 때 발생한다. 예를 들어 JVM의 메모리 부족, 스택 오버플로우, 메모리 누수(memory leak)과 같은 복구할 수 없는 상태를 나타낸다. 프로그래머가 미리 예측할 수 없기 때문에 처리할 수 없어서 신경쓰지 않아도 된다. (처리할 수 없으니까)
StackOverFlowError, OutOfMemoryError 등이 있다.
예외클래스의 상속 관계와 종류
- Checked Exceptions(Compile Exception)
컴파일 시점에 예외에 대해 처리(try/catch)를 해야한다. 하지 않으면 컴파일 에러가 발생한다. 트랜잭션 Rollback을 하지 않고 exception을 발생시킨다.
- Runtime Exception
Runtime과 Runtime을 상속하는 자식 클래스들을 Unchecked Exception이라고 부른다. 명시적인 처리를 강지하지 않는다. Runtime 이라는 이름에 걸맞게 실행 시점에 확인한다. 트랜잭션을 Rollback 한다.
예외 처리 방법
1. 예외 복구 (예외가 발생하면 다른 작업 흐름으로 유도하는 예외 복구)
int maxretry = MAX_RETRY;
while(maxretry -- > 0 ) {
try {
// 예외가 발생할 가능성이 있는 시도
return;
}
catch (SomeException e) {
// 로그 출력
// 정해진 시간만큼 대기
}
finally {
// 리소스 반남 및 정리 작업
}
}
throw new RetryFailedException(); // 최대 재시도 횟수를 넘기면 직접 예외 발생시킴
재시도를 통해 예외를 복구하는 코드.
예외가 발생하면 그 예외를 잡아서 일정 시간만큼 대기하고 다시 재시도를 반복한다. 그리고 최대 재시도 횟수를 넘기면 예외를 발생시킨다. 재시도를 통해 정상적인 흐름을 타게 한다거나, 예외가 발생하면 이를 미리 예측하여 다른 흐름으로 유도시키도록 구현하면 비록 예외가 발생하였어도 정상적으로 작업을 종료할 수 있을 것이다.
2. 예외처리 회피 (처리를 하지 않고 호출한 쪽으로 던져버리는 예외처리 회피)
public void add() throws SQLException {
... // 구현 로직
}
예외가 발생하면 throws를 통해 호출한 쪽으로 예외를 던지고 그 처리를 회피하는 것이다. 호출한 쪽에서 다시 예외를 받아서 처리하도록 하거나, 해당 메소드에서 이 예외를 던지는 것이 최선의 방법이라는 확신이 있을 때만 사용해야 한다.
3. 예외 전환 (호출한 쪽으로 던질 때 명확한 의미를 전달하기 위해 다른 예외를 전환하기 위하여 던지는 예외 전환)
catch(SQLException e) {
...
throw DulicateUserIDException();
}
예외가 발생하면 catch해서 더 자세한 exception을 다시 던지는 방법이다. 어떤 예외가 발생한 것인지 분명하게 알 수 있게 하기 위함이다. Checked Exception 중 복구가 불가능한 예외가 잡혔다면 이를 Unchecked Exception으로 전환하여 다른 계층에서 일일이 예외를 선언할 필요가 없도록 할 수도 있다.
'JAVA' 카테고리의 다른 글
if-else 과 switch 어느 것이 효율적일까? (0) | 2022.02.25 |
---|---|
JAVA 정규식 표현과 정규식 (0) | 2022.02.23 |
IntelliJ 단축키 설정 (0) | 2021.11.30 |
Call By Value / Call By Reference (0) | 2021.08.14 |
객체 복제 (0) | 2021.08.11 |