이렇게 처리해야할 주소와 해당 controller가 매칭이 되면은 4번으로 넘어간다.
Annotation | 설명 |
---|---|
@ControllerAdvice | Global 예외 처리 및 특정 package / Controller 예외처리 |
@ExceptionHandler | 특정 Controller의 예외처리 |
@Slf4j
@RestController
@RequestMapping("/api")
public class RestApiController {
@GetMapping(path = "")
public void hello(){
throw new RuntimeException("run time exception call"); //run time exception 확인
}
}
@Slf4j
@RestController
@RequestMapping("/api")
public class RestApiController {
@GetMapping(path = "")
public void hello(){
// throw new RuntimeException("run time exception call"); //run time exception 확인
var list = List.of("hello");
var element = list.get(1);
log.info("element : {}", element);
}
}
@Slf4j
@RestControllerAdvice(basePackageClasses = {RestApiBController.class})
public class RestApiExceptionHandler {
@ExceptionHandler(value = {Exception.class})
public ResponseEntity exception(
Exception e
){
log.error("RestApiExceptionHandler",e);
return ResponseEntity.status(200).build();
}
}
위와같이 발생했던 예외를 잡을 수 있다.
하지만 log에서 IndexOutOfBoundsException인데 해당 Exception은 클래스를 본면 RuntimeException이 있고 -> Exception을 상속 받고있다. 그러므로 우리가 Handler에서 지정한 Exception에 대해서 Catch한다.
@ExceptionHandler(value = {IndexOutOfBoundsException.class})
public ResponseEntity outOfBound(
IndexOutOfBoundsException e
){
log.error("IndexOutOfBoundsException",e);
return ResponseEntity.status(200).build();
}
그 결과 log.error("IndexOutOfBoundsException",e) 작성했던 것이 log로 나왔다. 기존에는 Exception 으로 잡기위한 것을 했다면, 이번에는 명확하게 IndexOutOfBoundsException으로 잡겠다 라며 지정 해줬다.