SizeLimitExceededException.class 핸들링이 Exception.class에 대한 핸들링과 함께 처리될 때만 안먹는 이유

smallcherry's techlog·2023년 1월 9일
0

문제 인지

Exception.class에 대한 핸들링 없이 SizeLimitExceededException 에러를 핸들링 하면 잘 작동했으나, Exception.class 에 대한 핸들링을 추가해주면 Exception.class에서 잡아 500에러를 발생시킴

SizeLimitExeededException을 핸들링 한 이유

  • 실제 최상단 에러는 MaxUploadSizeExceededException이었는데, 에러 메세지 상에서 보이는 최상단 에러는 SizeLimitExceededException으로 보여서 착각했다. Exception.class도 핸들링 하지 않았을 때 파일 사이즈 초과 시 찍히는 에러로그 Exception.class도 핸들링 하지 않았을 때 파일 사이즈 초과 시 찍히는 에러로그

해결 과정

논의했던 대로 Exception.class 핸들링 로직에 해당 Exception e가 instanceof SizeLimitExceededException인 경우를 따로 처리하도록 했지만 해당 조건문에 걸리지 않음.

에러를 받아서 직접 print를 찍어 확인해보니 아래와 같이 나왔음.

Untitled

그래서 MaxUploadSizeExceededException을 받아서 처리하니 잘 동작함.

알게 된 사실

  • 스프링에서 ControllerExceptionHandler에서 에러를 처리하는 방식을 알 수 있다.
    • 상황:
      • MaxUploadSizeExceededException was thrown
        • nested exception is IllegalStateException
          • nested exception is SizeLimitExceededException
    1. MaxUploadSizeExceededException 이 thrown 된다.
    2. ControllerExceptionHandler에서
      1. MaxUploadSizeExceededException를 핸들링 하는 로직이…
        1. 있으면 ⇒ 해당 에러에 대한 핸들링 처리.
        2. 없으면 ⇒ 그 에러의 부모 클래스 에러를 핸들링 하는 로직이..
          1. 있으면 ⇒ 그 로직을 타서 핸들링 처리. (예를 들어, Exception.class를 핸들링 하는 로직이 있다면 그 로직을 타게 됨)
          2. 없으면 ⇒ 2.b로 이동
      2. 해당 에러의 nested exception을 핸들링하는 지 찾는다
        1. 있으면 ⇒ 더 상단에 발생하는 에러부터 해당 에러에 대한 핸들링 처리 (예를 들어, IllegalStateException를 핸들링 하는 로직 있으면 해당 로직 수행, 없으면, SizeLimitExceededException를 핸들링 하는 로직이 있으면 그 로직을 수행)

        2. 없으면 ⇒ 스프링 내부적으로 알아서 처리

          Exception.class도 핸들링 하지 않았을 때 파일 사이즈 초과 시 찍히는 에러로그

          Exception.class도 핸들링 하지 않았을 때 파일 사이즈 초과 시 찍히는 에러로그

profile
Java Developer

0개의 댓글