在控制器類中添加上述方法。每一個將拋出的異常,即使是RuntimeException,它們都會被這個方法所捕獲。
@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)。