1、统一处理异常机制
在Spring MVC中,统一处理异常的机制具体表现为:无论是哪个处理请求的过程中出现异常,每种类型的异常只需要编写一段处理异常的代码即可!
2、统一处理异常机制的实现
统一处理异常的核心是定义处理异常的方法。在Spring MVC框架中,处理请求的方法都是被框架所调用的,所以,处理请求的方法抛出的异常也都会被框架捕获到,则框架会自动的使用此异常对象来调用处理异常的方法!类似于:
try{
框架.addNew();//框架调用了控制器类中处理异常的方法
} catch (ServiceException e){
框架.handleServiceException(e);//框架调用了处理异常的方法
}
在使用Spring MVC框架时,可以在类上添加@RestControllerAdvice注解,此类中特定的方法(例如统一处理异常的方法)将可以作用于整个项目中任何处理请求的过程中!
2.1 关于统一处理异常的类
该类必须在组件扫描的包下,在类上添加@ControllerAdvice / @RestControllerAdvice注解。
2.2关于统一处理异常的方法
在类中自定义处理异常的方法:
- 注解:@ExceptionHandler,表示此方法是处理异常的方法;可以在注解参数中指定需要处理的异常类型,此注解参数是数组,可指定多个异常类型。若未指定注解参数,则处理的异常类型以方法的参数中的异常类型为准。
- 访问权限:应该使用public
- 返回值类型:可参考处理请求的方法,例如:JsonResult类型
- 方法名称:自定义
- 参数列表:至少有1个被处理的异常类型参数,可按需添加特定类型的参数,例如HttpServletRequest、HttpServletResponse等,但不可以像处理请求的方法那么随意。
注意: 可以有多个处理异常的方法,但各方法处理的异常类型必须不同;各方法处理的异常类型允许存在继承关系,例如A方法处理NullPointerException,B方法处理RuntimeException,C方法处理Throwable。强烈推荐存在一个处理Throwable的方法,避免有异常不被处理。
例如:
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler
public JsonResult handleBindException(BindException e){
log.warn("程序运行过程中出现BindException,将统一处理!");
log.warn("异常信息:{}",e.getMessage());
return JsonResult.fail(ServiceCode.ERR_BAD_REQUEST,
e.getFieldError().getDefaultMessage());
}
}
@ExceptionHandler
public JsonResult handleThrowable(Throwable e){
log.warn("程序运行过程中出现Throwable,将统一处理!");
log.warn("异常类型:{}",e.getClass());
log.warn("异常信息:{}",e.getMessage());
String message = "服务器忙,请稍后再次尝试!";
e.printStackTrace();
return JsonResult.fail(ServiceCode.ERR_INTERNAL_SERVER_ERROR,message);
}