작성
·
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편에 나오는 예외 처리 과정에 대한 전체적인 그림입니다!
감사합니다.