자바를 사용하면서 다양한 코딩 실수들로 인한 오류가 생길 수 있습니다. 이를 예외(exception)
이라고 하죠!
예외가 발생하면 보통의 프로그램들은 종료가 되거나 프로그램이 중단됩니다. 하지만 이러한 오류들로 종료되지않고 정상 작동하게 하는 것을 예외 처리
라고 합니다.
예외와 오류의 차이
예외는 개발자가 개발 단계에서 예측가능해 방지할 수 있는 문제들 혹은 해결 가능한 문제
오류는 이후 발견되는 예측 못한 심각한 문제들
예외 처리는 크게 두 종류로 나뉩니다.
바로 Checked Exception
과 Unchecked Exception
이 있습니다.
둘의 특징은 다음과 같습니다.
Checked Excpetion | Unchecked Exception | |
---|---|---|
처리여부 | 반드시 예외처리! | 명시적인 처리를 강요하진 않음 |
확인시점 | 컴파일 단계 | 실행 단계 |
예외발생시 트랜잭션 처리 | roll-back X | roll-back O |
대표 예외 | Exeption의 상속 받는 하위 클래스 중 Runtime Exeption을 제외한 모든 예외 ex) IOExeption, SQLExeption | Runtime Exeption 하위 예외 ex) NullPointException, IllegalArgumentException, |
간단한 용어 정리
- 트랜잭션 : 작업 단위라는 뜻입니다. 위에서는 하나의 기능을 위한 업무 단위를 이야기 합니다.
- Roll-back : 이전 상태로 돌아가거나 다시 처음으로 돌아가는 것을 말합니다.
- checked exception : 다른 말로 필수 예외로 개발자가 꼭 예외처리를 해야하는 예외입니다.
Runtime Exeption 이외의 모든 예외입니다.- Uncheked exception : 다른 말로 실행 예외로 개발자가 반드시 처리해야하는 예외는 아닙니다. Runtime exception 클래스의 모든 하위 클래스가 해당됩니다.
- 클래스 분포도
Exception이 발생하여도 Application은 정상적으로 동작하게 하는 것
이 핵심입니다.
다른 비즈니스 로직 흐름으로 유도
시키거나, 예외가 발생하지 않는 상황으로 복구
를 시도하는 로직을 추가하는 방식이죠! 주로 네트워크를 연결이나 블루투스 연결과 같이 반복
적인 방법으로도 해결할 수 있는 곳에 사용됩니다. 다음 예시를 보시겠습니다.
private void mayThrowExceptionLogic() {
int maxTry = 20;
while(maxTry --> 0) {
try {
// ???Exception 이 Throw 될 수 가능성이 있는 로직
// 성공 시 return, 해당 메소드 종료
return ;
} catch(???Exception e) {
// Error 로그 출력
// 실패 로직 존재 시 원상 복구
// 일정 시간 동안 대기
} finally {
// 작업에 사용한 Resource 반환 및 정리
}
}
// 최대 횟수 실패시 예외 Throw
만약 서버 상태에 따라 접속 불안정 등으로 실패 가능성이 있는 로직에,
위 maxTry 만큼 정상 로직을 재시도하여 maxTry가 초과될 경우 또 다른 Exception으로 전환하여 Throw 한다면
maxTry의 시도로 비즈니스 로직이 정상 수행 될 수 있고,
throw new MaxTryFailedException();와 같이 새로운 Exception으로 전환하여 Throw 하지 않더라도,
해당 로직 실패시 다른 수행 로직을 첨가하여 Application의 흐름을 정상적으로 마무리할 수도 있게 됩니다.
이 방법은 간단하게 예외가 발생하면 throws를 통해 다른 메소드로 던져버리고 회피
하는 방법입니다. 이는 주의해야 할 점
이 exception을 통해 handling을 하는 것보다 expection을 회피하고 throw하는 것이 더 좋다는 확신이 들 때만 해야 한다는 것입니다.
private void mayThrowExceptionLogic() throws ???Exception {
// 비즈니스 로직
}
try {
// Exception 발생 가능 로직
}
catch(???Exception e) {
// Exception 로깅
// 복구 로직
throw CustomSpecificExceptionJustLikeNotAllowedUserException("이런상황~");
}
}
예외 전환은 특정 예외가 발생하면 새로운 예외로 전환하여 예외를 더욱 분명히해 처리하는 방식 입니다.
checked exception
처럼 복구 불가능 예외를 catch
하여 unchecked exception
으로 전환해 handling
함으로써 다른 계층에서 checked exception
을 일일이 선언하지 않아도 되게 할 때 많이 사용합니다.
int num = 5/0; // divide by 0
불가능한 산수를 진행하면 발생하는 예외입니다. 대표적으로 divide by 0 문제, 즉 정수를 0으로 나누려고 할 때 발생합니다.
int[] arr = {1,2,3};
System.out.println(arr[3]); // 배열 범위 벗어남
배열의 범위를 벗어난 index에 접근할 시 발생합니다.
파일을 찾을 수 없을 때 발생합니다.
String str = null;
System.out.println(str.equals("exception")); // null
존재하지 않는 레퍼런스를 참조할 때 발생합니다.
해당 사이트의 내용을 참고로 작성했습니다. 추후에 더 알게 되는 내용들을 추가하겠습니다.
ChanBLOG
코드 연구소
tcpschool
Catsbi's DLog
Dev Day
복세편살 개발라이프
차근차근 개발로그
코딩팩토리
장쫄깃 기술블로그
GilLog