方法一、使用 @ ExceptionHandler 注解
统一处理某一类异常,从而能够减少代码重复率和复杂度,该注解作用对象为方法,并且在运行时有效,value()可以指定异常类。由该注解注释的方法可以具有灵活的输入参数(详细参见Spring API),使用该注解有一个不好的地方就是:进行异常处理的方法必须与出错的方法在同一个Controller里面。而且不能全局控制异常。每个类都要写一遍。使用如下:
- 步骤一:在controller中自定义一个异常处理函数即可
方法二、实现 HandlerExceptionResolver 接口
这种方式可以进行全局的异常控制。例如
@Component
public class ExceptionTest implements HandlerExceptionResolver{
/**
* TODO 简单描述该方法的实现功能(可选).
* @see org.springframework.web.servlet.HandlerExceptionResolver#resolveException(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse, java.lang.Object, java.lang.Exception)
*/
public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler,
Exception ex) {
System.out.println("This is exception handler method!");
return null;
}
}
方法三、使用 @controlleradvice+@ExceptionHandler 注解 Spring 3.2 带来的新特性
@controlleradvice该注解作用对象为TYPE,包括类、接口和枚举等,在运行时有效,并且可以通过Spring扫描为bean组件。其可以包含由@ExceptionHandler、@InitBinder 和@ModelAttribute标注的方法,可以处理多个Controller类,这样所有控制器的异常可以在一个地方进行处理,异常集中处理,更好的使业务逻辑与异常处理剥离开
@controlleradvice+@ExceptionHandler结合使用适用于runtimeException
-
步骤一:自定义个异常处理类
-
步骤二:在需要处理异常的控制器类上添加@ ControllerAdvice注解,此控制器下的所有方法的异常都会被自定义异常处理
优先级
既然在SpringMVC中有两种处理异常的方式,那么就存在一个优先级的问题:
当发生异常的时候,SpringMVC会如下处理:
(1)SpringMVC会先从配置文件找异常解析器HandlerExceptionResolver
(2)如果找到了异常异常解析器,那么接下来就会判断该异常解析器能否处理当前发生的异常
(3)如果可以处理的话,那么就进行处理,然后给前台返回对应的异常视图
(4)如果没有找到对应的异常解析器或者是找到的异常解析器不能处理当前的异常的时候,就看当前的Controller中有没有提供对应的异常处理器,如果提供了就由Controller自己进行处理并返回对应的视图
(5)如果配置文件里面没有定义对应的异常解析器,而当前Controller中也没有定义的话,那么该异常就会被抛出来。