[Java] Exception Handling

Jay Mild Lee·2022년 12월 16일
0

Java

목록 보기
10/10

I. Error vs Exception

프로그램은 어떠한 원인으로 인해 오작동 혹은 비정상적으로 종료되는 경우가 있다. 이를 Error라고 하는데, Error발생 시점에 따라 크게 3가지로 나눌 수 있다.

  1. Compile Error : Compile 시에 발생하는 Error
  2. Runtime Error : 프로그램 실행 시 발생하는 Error
  3. Logical Error : 실행은 되지만, 의도와 다르게 동작하는 Error

Java는 발생할 수 있는 Error를 2가지로 구분한다.

  1. Error : 프로그램 코드에 의해서 수습될 수 없는 심각한 오류
  2. Exception : 프로그램 코드에 의해서 수습될 수 있는 사소한 오류

II. 계층 구조

Java에서는 발생할 수 있는 ErrorException을 클래스로 정의한다. 구조는 다음과 같다.

1. RuntimeException

Compiler None-Check Exception. 프로그램의 실행 도중 예측 불가능한 방향으로 발생하는 Exception. 예측이 불가능하기 때문에, Compile 과정에서 예외 처리 코드가 명시되어 있는지 확인하지 않음.

2. Exception(일반)

Compiler Check Exception. 프로그램 실행 도중 예외가 발생할 가능성이 높기 때문에, Compile 과정에서 예외 처리 코드가 명시되어 있는지 확인함.

III. Exception Handling

1. try-catch-finally block

try-catch-finally blockConstructor 내부와 Method 내부에서 작성되며, Exception이 발생했을 때 예외처리를 할 수 있도록 한다.

try {
	[예외가 발생할 수 있는 코드]
} catch(ExceptionClass e) {
	[예외 처리 로직]
} finally {
	[항상 실행되는 로직]
}

1) 다중 catch

try block 내부에는 다양한 예외가 발생할 수 있다. 발생되는 예외에 따라 다른 Exception Handling을 적용하려면, 다중 catch block을 통해 구현할 수 있다.

try {
	[예외가 발생할 수 있는 코드]
} catch(ExceptionClass1 e1) {
	[예외 처리 로직1]
} catch(ExceptionClass2 e2) {
	[예외 처리 로직2]
} finally {
	[항상 실행되는 로직]
}

💡 참고사항
catch block선언되어 있는 순서대로 실행되며, 앞선 catch block에서 Exception이 발생할 경우 나머지 catch block은 호출되지 않는다.

2. throw, throws

1) throw

프로그래머가 강제로 예외를 발생시키는 것.

2) throws

Method에서 처리하지 않은 예외를 호출한 곳으로 떠넘기는 것.

2-1) Filter를 통한 예시

2-1-1) JwtAuthFilter
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException, CustomSecurityException {
        System.out.println("JWTAuthFilter Called");
        // Login, SignUp 기능의 경우 해당 Filter 건너뜀.
        String uri = request.getRequestURI();

        if (uri.equals("/login") || uri.equals("/signup")){
            System.out.println("JWT Filter Skipped");
            filterChain.doFilter(request, response);
            return;
        }
        // 1. Request에서 토큰 추출
        String token = jwtUtil.resolveToken(request, "AccessToken");

        // 2. Token 유효성 검사 및 인증
        // 2-1. Token 존재 여부 확인
        if(token == null) {
            System.out.println("There is no Token");
            throw new CustomSecurityException(CustomSecurityErrorCode.JWT_NOT_FOUND);
        }
        // 2-2. Token 유효성 확인
        if(!jwtUtil.validateAccessToken(token, request, response)){
            System.out.println("Token is invalid");
            throw new CustomSecurityException(CustomSecurityErrorCode.INVALID_JWT);
        }
        // 3. 사용자 인증
        Claims info = jwtUtil.getUserInfoFromHttpServletRequest(request);
        setAuthentication(info.getSubject());

        // 4. 다음 필터로 보냄
        filterChain.doFilter(request,response);
    }
2-1-2) JwtExceptionHanlderFilter
@Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
        try {
            filterChain.doFilter(request, response);
        } catch (CustomSecurityException ex){
            log.error("JWT 인증/인가 관련 이슈");
            setErrorResponse(response, ex);
        }
    }

5. 커스텀한 예외 만드는 방법

기존에 정의된 예외 클래스 외에 필요에 따라 사용자 정의 클래스를 정의하여 사용할 수 있다.

public class CustomException extends RuntimeException {
    private final CommonErrorCode errorCode;
}

0개의 댓글