컨트롤러 클래스 내에 위의 메서드를 추가하십시오. RuntimeExceptions조차 던져 질 모든 예외는이 메소드에서 잡힐 것입니다.
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
@ExceptionHandler(Exception.class)
public ModelAndView handleException(Exception ex) {
Logger.getLogger(GuestNavController.class).error(ex);
ModelAndView modelAndView = initializeModelAndView("guest/error500");
return modelAndView;
}
그것은 당신이 @ExceptionHandler 예외 매개 변수와 메소드의 인수를 변경하면 특정 예외를 잡을 수있을 것이다 (그들이 동일해야)하는 것이 분명하다.
컨트롤러 클래스가 두 개 이상인 경우 컨트롤러 도움말을 만들어야합니다. 소스 코드에 위의 클래스를 추가 할 수 있습니다.
@ControllerAdvice
public class ExceptionManager {
private final Logger logger = Logger.getLogger(ExceptionManager.class);
@ResponseStatus(HttpStatus.NOT_FOUND)
@ExceptionHandler(NoHandlerFoundException.class)
public ModelAndView handleError404(Exception ex) {
logger.error("ERROR 404: " + ex.getMessage());
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("guest/error404");
return modelAndView;
}
}
이 클래스 내부에 하나 이상의 방법을 추가 할 수 있습니다. 이 메서드는 Throw되는 모든 예외를 캐치합니다.
위의 두 가지 해결 방법을 모두 포함하고있는 경우를 대비하여을주의하십시오. @ExceptionHandler 주석을 가지는 메소드를 포함한 컨트롤러에 예외가 슬로우되었을 경우, 예외는이 메서드에 의해서만 캐치되어 외부 클래스에서는 캐치되지 않습니다. 외부 클래스 (솔루션 2)는 내부 메서드 (솔루션 1)에 포착되지 않는 예외를 catch합니다.