在控制器类中添加上述方法。每个将被抛出的异常,甚至是 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;
}
}
您可以在此类中添加多个方法。此方法将捕获每个抛出的异常。如果您包含上述两种解决方案,
请小心。如果在包含带有 @ExceptionHandler 注释的方法的控制器中引发异常,则该异常将仅由该方法捕获,而不会从外部类捕获。外部类(解决方案 2)将捕获内部方法未捕获的异常(解决方案 1)。