본문 바로가기
Programming/JAVA

[Java] Java Exception 처리하기

by 코딩의성지 2021. 9. 15.

 

자바에서 에러나 예외 클래스의 계층 구조를 그려보면 위에 그려놓은 정보와 같다. 상위에 있는 Throwable 클래스를 기준으로 하여 Error 와 Exception 으로 나눠진다. Exception 은 또 컴파일 단계에서 발생할 수 있는 Checked Exception 과 실행 환경에서 발생할 수 있는 Unchecked Exception으로 나뉘어진다. 그리고 자바 같은경우에는 실행 시점에서 Error 가 날수도  Exception 이 발생할 수 도 있다.

 

Error

에러가 발생하면 시스템이 비정상 종료된다든지 하는 비정상 상황이 생긴다.

대표적인 에러로는 메모리가 부족해서 생기는 OOM(Out Of Memory) Error 나 스택 영역의 메모리가 지정된 점위를 넘어갈 때 발생하는 Stack Overflow Error 를 예로 들 수 있다. 이러한 에러가 발생하면 트러블 슈팅 과정에서 굉장히 힘든 경험을 할수 있을거다. 이와 같은 에러는 예측하기도 쉽지 않고 처리할 수 있는 방법도 없다.

 

Exception

예외는 프로그램에서 보통 개발자의 실수로 인해 생기는 경우가 많다. 그 이유는 Exception 은 개발자가 구현한 로직 내에서 발생하기 때문이다. 그렇기에 Exception 같은 경우는 미리 예측하여 처리가 가능하다. 

 

Checked Exception

체크 예외의 경우 실행 환경에서의 예외(RuntimeException)가 아니면서 Exception 하위의 클래스들을 의미한다. Checked Exception 은 대표적으로 입출력시 발생하는 IOException, 존재하지 않는 파일의 이름을 읽을때 발생하는 FileNotFoundException, 존재하지 않는 클래스의 이름을 읽을때 발생하는 ClassNotFoundException 등이 있다.

 

Spring에서 체크 예외의 경우, 예외발생시 트랜잭션처리할때 rollback을 하지 않고 트랜잭션이 커밋되는 것을 기본적략으로 가져가니 이것도 잘 기억해두자.

 

Unchecked Exception

언체크 예외의 경우는 실행(runtime) 환경에서 발생할 수 있는 예외를 의미한다. RuntimeException 하위에 있는 예외를 의미한다. 해당 예외는 예외처리를 강제로 하게 하지 않는다.

대표적인  예외로는 예외적인 산술조건 이 발생할때( 예를 들면 0으로 나누기 등) 던지는 ArithmeticException, 잘못된 인자를 전달할때 발생하는 IllegalArgumentException, 배열의 범위를 벗어나서 사용할때 발생하는 ArrayIndexOutOfBoundsException, null 인 참조변수를 참조하다가 발생하는 NullPointerException 등이 있다.

 

Spring에서는 언체크 익셉션의 경우 예외발생시 트랜잭션을 처리할 때 rollback되는 것을 기본 전략으로 가져가니 잘 기억해두자.

 

예외 처리방법론

1. 예외 복구하기

불안정적인 네트워크 환경에서 서버접속 환경속에서 일정횟수만큼 재시도를 반복하게하는 방법이다.

int max = MAX_RETRY_CNT;

while(max-- > 0) {
	try {
    	...
        return; // 작업 성공
    } catch(...Exception e) {
    	... // 정해진 시간 만큼 대기 하는 로직이나 로그 출력
    } finally {
    	... // 리소스 반납 로직
    }
}

throw new RetryFailedException(); // 정해놓은 최대 횟수 넘기면 예외 발생

 

2. 예외처리 회피하기

예외처리를 로직에서 담당하지 않고 호출한 쪽으로 던져버리는 것ㄷ을 의미한다. 하지만 무작정 회피해서는 안되고 예외를 복구하는 것처럼 의도가 명확해야한다. 보통 DAO 클래스에서 SQLException 을 던지는 경우가 많은데, 이경우에 다른 계층의 클래스에서 SQLException 을 처리해줘야하는데 설계적으로맞는지를 잘 생각해봐야하는 것이다.

public void insert() throws SQLException {
	...
}

 

3. 예외 전환하여 처리하기

예외를 잡아 다른 예외를 던지는 것을 의미한다. 호출한 쪽에서 예외를 받아서 좀더 명확하게 인지하여 예외를 처리할 수 있게해준다.

catch(IOException e) {
 	...
    throw CustomException();
}

끝.

반응형

댓글