인프런 커뮤니티 질문&답변

zzzzz님의 프로필 이미지

작성한 질문수

스프링 MVC 2편 - 백엔드 웹 개발 활용 기술

HandlerExceptionResolver 시작 8분 7초에서 질문입니다.

작성

·

106

0

package com.example.exception.resolver;

import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView;

import java.io.IOException;

@Slf4j
public class MyHandlerExceptionResolver implements HandlerExceptionResolver {
    @Override
    public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
        try {
            if (ex instanceof IllegalArgumentException) {
                log.info("IllegalArgumentException resolver to 400");
                response.sendError(HttpServletResponse.SC_BAD_REQUEST, ex.getMessage());
                return new ModelAndView();

            }
        }
        catch (IOException e){
            e.printStackTrace();
        }


        return null;
    }
}

 

 

package com.example.exception.api;


import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.server.ResponseStatusException;

@Slf4j
@RestController
public class ApiExceptionController {

    @GetMapping("/api/members/{id}")
    public MemberDto getMember(@PathVariable("id") String id) {

        if (id.equals("ex")) {
            throw new RuntimeException("잘못된 사용자");
        }
        if (id.equals("bad")) {
            throw new IllegalArgumentException("잘못된 입력 값");
        }
        return new MemberDto(id, "hello " + id);
    }
    @Data
    @AllArgsConstructor
    static class MemberDto {
        private String memberId;
        private String name;
    }

}
 if (ex instanceof IllegalArgumentException) {

위에 코드가 "ex" 객체가 IllegalArgumentException 클래스의 인스턴스인지를 확인합니다.

근데 ex객체가 어디 선언되어있나요?

 

답변 1

0

안녕하세요. zzzzz님, 공식 서포터즈 y2gcoder입니다.

먼저 간단하게 Exception 타입의 ex 객체는

@Override
    public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {

위의 MyHandlerExceptionResolver 의 resolveException()의 파라미터로 들어오고 있습니다!

더 나아가서 이러한 것을 어떻게 던져주냐고 물어보신다면 스프링에서 컨트롤러 밖까지 처리되지 않고 던져진 예외를 잡아서 해당 메서드를 호출해주고 있다고 생각해주시면 감사하겠습니다! 자세한 것은 스프링 MVC 2편 - 백엔드 웹 개발 활용 기술을 학습해주십쇼! 아래는 MVC 2편에 나오는 예외 처리 과정에 대한 전체적인 그림입니다!

image

 

감사합니다.

zzzzz님의 프로필 이미지

작성한 질문수

질문하기