简介
开发过程中,对于异常的处理及其重要,但是开发代码中发生的异常往往并不是我们程序员可以考虑周到的,因此项目中通常会使用全局捕获异常来统一处理一些异常的发生,当异常发生时(代码中被我们抛出时),全局异常不捕获器或捕获这些异常,按照我们自己定义的出来对请求做出相应的相应(返回View视图,重定向或者自定义响应体/json数据格式等等)。
实现方法(springboot项目为例)
首先配置一个全局异常捕获器,@RestControllerAdvice(@ControllerAdvice)应用到所有@RequestMapping注解上,当抛出异常时,在带有@RestControllerAdvice(@ControllerAdvice)注解的全局异常捕获类中根据@ExceptionHandler(value = AntException.class)所定义的异常类进行对应d 异常处理,进行相应返回。@RestControllerAdvice与@ControllerAdvice的区别即一个指定返回数据都为JSON或String,@RestControllerAdvice相当于使用了@ControllerAdvice和@ResponseBody两个注解。
/**
* 全局统一异常处理类
*/
@RestControllerAdvice
public class GlobalExceptionHandler {
/**
* AntException异常类处理方法
*/
@ExceptionHandler(value = AntException.class)
public AntResponse antExceptionHandler(HttpServletRequest request,AntException antException) throws Exception{
AntResponse antResponse=new AntResponse();
antResponse.setResp(antException);
return antResponse;
}
/**
* 请求参数异常处理方法
* BindException.class:处理Get请求中 使用@Valid 验证路径中请求实体校验失败后抛出的异常
* MethodArgumentNotValidException.class:处理请求参数格式错误 @RequestParam上validate失败后抛出的异常是javax.validation.ConstraintViolationException
* MethodArgumentNotValidException.class:处理请求参数格式错误 @RequestBody上validate失败后抛出的异常是MethodArgumentNotValidException异常
*/
@ExceptionHandler(value = {MethodArgumentNotValidException.class, BindException.class, ConstraintViolationException.class})
public AntResponse MethodArgumentNotValidHandler(Exception exception) throws Exception{
AntResponse antResponse =new AntResponse();
String errMsg=null;
if(exception instanceof BindException){
BindingResult bindingResult=((BindException) exception).getBindingResult();
FieldError fieldError=bindingResult.getFieldError();
errMsg=fieldError!=null?fieldError.getDefaultMessage():null;
}else if(exception instanceof MethodArgumentNotValidException){
BindingResult bindingResult= ((MethodArgumentNotValidException) exception).getBindingResult();
FieldError fieldError=bindingResult.getFieldError();
errMsg=fieldError!=null?fieldError.getDefaultMessage():null;
}else if(exception instanceof ConstraintViolationException){
errMsg=((ConstraintViolationException) exception).getConstraintViolations().iterator().next().getMessage();
}
antResponse.setError(AntResponseCode.ILLEGAL_PARAMETER,errMsg);
return antResponse;
}
}
总结
@RequestMapping所映射的所有接口及其调用的方法、类中一旦抛出异常时,便会在使用了@RestControllerAdvice或@ControllerAdvice的全局异常捕获类中根据@ExceptionHandler(value = Exception.class)注解所定义的对应value来匹配抛出的异常类型,进行相应的处理。
评论区