[부트캠프] TIL - 에러핸들링
개인 과제를 진행하면서 입출력 처리 과정 및 실행 흐름 테스트를 수백번씩 하며
많은 try catch 및 throw 를 활용하여 예외처리 에러처리를 하여 실행 흐름이 끊기지 않고
매끄럽게 이어지도록 수정하는 작업을 진행했다.
진행 과정에서 사용했지만, 어떻게 동작하는지 모르고 사용한 것들과 알고 사용했지만 기억하고자 하는 부분들에 대해 남깁니다.
1. 예외 발생시키기 (throw)
사용자가 직접 에러를 발생시켜 처리한다는 의미로 생각하면 된다.
"custom message" 부분에 직접 에러 메시지를 작성할 수 있고, 작성한 메시지는 catch 부분에서 getMessage()를 통해
가져올 수 있다.
try{
if(true){
//어거지이지만 에러를 발생 new 키워드를 사용하고 에러 메시지를 직접 작성도 가능하다.
throw new ArithmeticException("custom message");
}
} catch(ArithmeticException e){
System.out.println(e.getMessage());
}
2.예외 떠넘기기 (throws)
함수 선언부 끝에 작성하여 try catch로 에러를 처리하는 것이 아니라, 함수를 호출했던 곳으로 에러를 넘겨버리는방법.
//개인과제 작성 코드 일부
public class DivideOperator{
public int operate(double firstNumber, double secondNumber) throws ArithmeticException {
double result;
if(secondNumber == 0){
throw new ArithmeticException("나눗셈 연산에서 분모에 0이 입력될 수 없습니다.");
}
result = firstNumber / secondNumber;
return (int) result;
}
}
나누기 계산에서 분모에 0값이 들어올 경우 직접 입력한 에러 메시지를 가진 ArithmeticException 에러 객체를 생성시켜서
throw 한다, 함수 내부 로직을 보면 try catch문은 존재하지않고, 함수 선언부 끝에 throws ArithmeticException 이 적혀있다.
이것은 해당 함수를 호출한 Main 메소드라던지, 어떤 클래스의 내부 메소드라던지 의 로직에서 try catch문을 통해
다뤄줘야 한다.
+추가
throws 뒤에는 여러 가지 에러 타입이 올 수 있다
void ThrowsError() throws Exception, Exception2, ... {
Error; // 예외가 발생하면 현 메소드를 호출한 쪽으로 올라간다.
}
3. 예외 복구
예외 상태를 파악하고 실행흐름을 끊지 않은 상태에서 반복문을 사용하여 일정 횟수만큼 반복 시도를 하고
반복 시도가 일정 횟수를 넘어가면 예외를 발생시키거나 다른 실행흐름으로 변경시키는 방법.
네트워크 연결같은 로직에서 사용되는 방식이다, 연결시도를 한번만 하는것이 아니라 일정 시간 간격으로 지속적인
연결 시도를 하고 그래도 되지 않는다면 오류 메시지를 출력하거나 다른 문제 해결 방법을 제안하는 식으로.
final int MAX_TRY = 10;
//정해진 횟수만큼 반복하여 실행하고
public int someMethod() {
int result;
int maxtry = MAX_TRY;
while(maxtry > 0) {
try {
//처리 로직
//실행 성공시 return;
return result;
} catch(Exception e) {
// 예외 처리
}
maxtry--;
}
//정해진 횟수만큼 반복해도 안된다면 예외를 발생시킴
throw new CustomException();
}