Spring MVC提供了一种定义明确的处理机制来管理应用程序抛出的异常。
主要思想:在控制器类中,使用@ExceptionHandler注解定义用于处理该异常的方法
语法:该注解可以接收异常类作为其value参数,比如@ExceptionHandler(UserNotFoundException.class) 其中UserNotFoundException是自定义的异常类,也可以指定处理多个异常类,比如这样@ExceptionHandler(value = {MissingServletRequestParameterException.class,BindException.class}),这样就会处理多个异常了。
用例:
Step1:定义一个扩展了Exception的自定义异常类UserNotFoundException
public class UserNotFoundException extends Exception { public UserNotFoundException(String name){ super("User not found with name:"+name); } }Step2:控制器中定义使用注解@ ExceptionHandler的处理器方法
@Controller public class UserExceptionController { private Map<String,UserException> users = new HashMap<String, UserException>(); @PostConstruct public void setUsers(){ users.put("mert",new UserException("Mert","Caliskan")); users.put("kenan",new UserException("Kenan","Sevindik")); } @RequestMapping("/formException") public ModelAndView user(){ return new ModelAndView("userException","userException",new UserException()); } @RequestMapping("/resultException") public ModelAndView process(String name)throws Exception{ System.out.println(name); ModelAndView modelAndView = new ModelAndView(); UserException userException = users.get(name); if ("johndoe".equals(name)){ throw new Exception(); } if(userException==null){ System.out.println("In userException"); throw new UserNotFoundException(name); } modelAndView.addObject("userException",userException); modelAndView.setViewName("userExceptionResult"); return modelAndView; } @ExceptionHandler public ModelAndView handleException(UserNotFoundException e){ ModelAndView modelAndView = new ModelAndView("errorUser"); modelAndView.addObject("errorMessage",e.getMessage()); return modelAndView; } }
注意:这个只会是在当前的Controller里面起作用。一般来说应该在一个公共的中心位置处理异常,所以创建一个可以处理异常的全局方法就显得很有必要。Spring MVC提供了另一个注解@ControllerAdvice来完成该目的。使用注解@ControllerAdvice的类可以使用包含使用@ExceptionHandler、@InitBinder和@ModelAttribute注解的方法,而这些方法可以用于应用程序中使用@RequestMapping注解的所有方法。更通用的异常(比如SQLException或IOException)则可以在一个全局控制器中处理。
比如上述用户搜索关键字johndoe时,使用了java.lang.Exception类。全局控制器包含了处理该异常的方法
@ControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(Exception.class) public ModelAndView handleException(){ return new ModelAndView("errorGlobal"); } }