[TIL] Java에서 try-catch 블록: Exception 타입 참조변수 사용과 예외 처리 방법

김하밍·2023년 11월 14일

Java

목록 보기
17/46

❓나의 궁금

try-catch 블록에서 catch(Exception e) 와 같이 처음부터 모든 예외를 처리하는 방법을 사용하지 않고, 다른 예외 처리를 먼저 하고 마지막에 Exception을 선언하는가?

✅ 찾은 답변

  1. 모든 예외를 한꺼번에 처리하는 것은 예외의 종류에 따라 적절한 대응을 할 수 없게 됩니다.
  • 특정 예외에 대해 특별하고 다르게 처리하여 유지보수성과 디버깅을 향상시키는 것이 더 좋은 방법입니다.
  1. 의도하지 않은 예외까지 처리하게 됩니다.
  • Exception 은 모든 예외의 부모 클래스 즉, 최고 조상 클래스이므로, 의도치 않은 예외까지 처리될 수 있습니다.
    이러한 결과는 프로그램의 동작을 예측하기 어렵게 만들 수 있게 됩니다.

❓나의 궁금

예외처리 방식에서 @(Rest)ControllerAdvice 애너테이션 vs try-catch문 차이가 무엇일까?

✅ 찾은 답변

✔️ 애너테이션 예외 처리 예제

@RestControllerAdvice
public class GlobalExceptionAdvice {
    @ExceptionHandler(BusinessLogicException.class)
    public ResponseEntity<?> handleBusinessLogicException(BusinessLogicException e) {
        HttpHeaders headers = new HttpHeaders();
        headers.add("BBANGBBANG_EXCEPTION", String.valueOf(e.getExceptionCode().getStatus()));

        return ResponseEntity.ok().headers(headers).body(e.getMessage());
    }
}

✔️ try-catch문 예외 처리 예제

@Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
        try {
            Map<String, Object> claims = verifyJws(request, response);
            setAuthenticationToContext(claims);
        } catch (ResponseStatusException be) {
            if (be.getStatus() == HttpStatus.UNAUTHORIZED) {
                response.sendError(HttpServletResponse.SC_UNAUTHORIZED, be.getMessage());
                return;
            }
            request.setAttribute("exception", be);
        } catch (SignatureException se) {
            request.setAttribute("exception", se);
        } catch (ExpiredJwtException ee) {
            request.setAttribute("exception", ee);
        } catch (Exception e) { //  최고조상 -> 마지막 catch문에
            request.setAttribute("exception", e);
        }

        filterChain.doFilter(request, response);
    }

1. ResponseStatusException 처리:
- ResponseStatusException 이 발생하면 특정 HTTP 응답 코드로 응답하고, 메세지를 클라이언트로 전달하고 있습니다.

2. SignatureException, ExpiredJwtException 처리:
- 각각의 예외에 대해서는 request.setAttribute("exception", ...) 를 통해 예외를 저장하고 있습니다. 이렇게 함으로써, 필터를 실행하는 도중 발생한 예외를 서블릿 컨테이너에게 전달하고자 합니다.

3. 그 외 모든 예외 처리:
- 가장 상위 클래스의 Exception 타입으로 모든 예외를 처리합니다. 이 경우에도 request.setAttribute("exception", ...) 를 통해 예외를 저장하고 있습니다.

try-catch문을 사용하면 세밀한 예외 처리 로직을 정의할 수 있습니다. 특정 예외에 대한 세부적인 처리가 필요한 경우, 애너테이션보다 catch 블록이 더 유연하게 대응할 수 있습니다.

  • 커스텀 로직을 적용할 수 있다는 장점도 있습니다. 예외 발생 시 특별한 헤더를 설정하거나 로깅을 추가하는 등의 작업을 수행할 수 있습니다.
  • 하나의 코드 스니펫 내에서 여러 종류의 예외가 발생할 수 있습니다. 각각의 에외에 대해 다른 처리 로직을 수행하고자 try-catch문을 사용하여 특별한 HTTP 응답 코드를 설정하고, 다른 예외들은 request.setAttribute 를 통해 예외를 저장할 수 있었습니다.

✅ try-catch문 자체는 Java 언어의 기본 문법 중 하나로, 어떠한 프레임워크를 사용하든 일반적으로 예외 처리를 위해 사용될 수 있지만, 위 코드 내부의 로직을 살펴보면 Spring 프레임워크를 활용하여 HTTP응답을 처리하고 예외를 저장하는 로직으로 이루어져 있습니다.

profile
나만의 언어로 기록하며 성장하기 !

0개의 댓글