Exception?
- Java object 의 Throwable 클래스에는 Error / Exception 클래스 존재한다.
- Exception은 java.lang.Exception 클래스와 그 서브클래스들이 쓰이는 상황이다.
- 이 예외들은 Checked Exception 과 Unchecked Exception 두 가지로 나눌 수 있다.
- 언체크 예외(unchecked exception)은 RuntimeException을 상속한 것
- 체크 예외는 그 이외의 예외들을 말한다.
Checked Exception 체크 예외
- 체크 예외는 상술했듯 RuntimeException을 상속하지 않는 예외들이다.
- 컴파일 단계에서 확인된다.
- 복구가 가능한 예외들이기에 반드시 catch, throws를 통해 예외를 처리하는 코드를 함께 작성해야한다.
- ClassNotFoundException, IOException, SQLException 등이 해당한다.
Unchecked Exception 언체크 예외
- 런타임 예외라고도 부르는 언체크 예외들은 명시적인 예외 처리를 강제하지 않는다.
- 따라서 unchecked exception인 것이다.
- 실행 단계에서 확인된다.
- 이들은 프로그램에 오류가 있을때 발생하도록 의도된 것들이다.
- NullPointerException, illegalArgumentException, ArrayIndexOutOfBoundsException 등이 해당한다.
일반적인 예외 처리 방법들
예외복구
예외 복구의 핵심은 예외가 발생하여도 Application은 정상적으로 동작한다는 것.
private void mayThrowExceptionLogic() { int maxTry = 20; while(maxTry --> 0) { try { // ???Exception 이 Throw 될 수 가능성이 있는 로직 // 성공 시 return, 해당 메소드 종료 return ; } catch(???Exception e) { // Error 로그 출력 // 실패 로직 존재 시 원상 복구 // 일정 시간 동안 대기 } finally { // 작업에 사용한 Resource 반환 및 정리 } } // 최대 횟수 실패시 예외 Throw throw new MaxTryFailedException(); }
예외 회피
자신이 예외를 처리하지 않고 호출한 쪽으로 throw 한다.
무분별하게 사용해선 안된다. 호출한 쪽에서 예외를 처리하는게 맞을 경우에만 사용한다.
private void mayThrowExceptionLogic() throws ???Exception { // 비즈니스 로직 }
<br>
예외전환
예외를 복구해 정상적 상태로 만들수없기 때문에 예외가 발생한 메소드 밖으로 던지는 방법이다.
적절한 예외로 전환해서 던진다.
try { // Exception 발생 가능 로직 } catch(???Exception e) { // Exception 로깅 // 복구 로직 throw CustomSpecificExceptionJustLikeNotAllowedUserException("이런상황~"); }
/* 1번은 예외를 던지는 경우, 예외의 이름을 보고 어떤 문제가 있는 예외인지 알 수 있게 해준다. 예를 들어, 사용자의 아이디가 겹치는 예외의 경우 일반적인 SQLException이 아니라, DuplicatedUserIDException으로 던지게 되면, 호출한 쪽에서는 단순히 SQLException이 아닌, 사용자의 아이디가 겹쳐서 발생하게된 예외인지를 인식할 수 있게 된다. */ /* 2번은 복구 가능한 예외가 아닌경우, RuntimeException으로 포장해서 던지는 방법이다. 이렇게 체크 예외를 언체크 예외인 RuntimeException으로 포장해서 던지는 경우, 불필요한 throws 구문이 줄게 된다. */
중요한건?
편한 길을 선택하지말고 어떤 방법으로 예외처리를 할지 고민하고 방법을 선택해야한다.
Catch에 e.printStackTrace / throw 를 남발하지 말고,
로깅, 복구 로직 등을 추가한다.
Error?
- 에러는 시스템에 비정상적 상황이 발생했을 경우 발생한다.
- 메무리 부족이나 스택오버플로우처럼 복구할 수 없다.
- 이러한 에러는 개발자가 예측하기 쉽지않고, 처리할 수 있지도 않다.
'개발' 카테고리의 다른 글
Git 사용중 로컬-원격 저장소간 충돌상황일때(변경 사항이 충돌하지 않을때) (0) | 2023.03.16 |
---|---|
자바 서블릿에서의 session (0) | 2023.03.14 |
[북TIL] 파이썬 알고리즘 인터뷰 7장 배열 (0) | 2022.08.11 |
데이터베이스의 병행제어기법 (0) | 2022.07.16 |
인터페이스 모듈 연계 방식 EAI와 ESB (0) | 2022.07.14 |