侧边栏壁纸
博主头像
小白博主等级

just do it!

  • 累计撰写 60 篇文章
  • 累计创建 77 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

Spring中全局捕获异常

小白
2019-09-30 / 0 评论 / 0 点赞 / 148 阅读 / 589 字

简介

开发过程中,对于异常的处理及其重要,但是开发代码中发生的异常往往并不是我们程序员可以考虑周到的,因此项目中通常会使用全局捕获异常来统一处理一些异常的发生,当异常发生时(代码中被我们抛出时),全局异常不捕获器或捕获这些异常,按照我们自己定义的出来对请求做出相应的相应(返回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来匹配抛出的异常类型,进行相应的处理。

0

评论区