原创

使用RestControllerAdvice全局捕获异常自定义异常

随着技术的不断革新,码农们对代码的要求也越来越高,整个项目当中过多的try...catch让你的代码显得十分臃肿,经过这两年的学习,我也找到一些教程,自定义异常,加上全局捕获异常可以让你的代码更加清晰易懂。废话不多说,上代码

@Slf4j
@RestControllerAdvice
public class UnionExceptionHandler {


    @ExceptionHandler(MethodArgumentNotValidException.class)
    @ResponseBody
    public Map<String, Object> handleConstraintViolationException(MethodArgumentNotValidException e) {
        BindingResult result = e.getBindingResult();
        Map<String, Object> map = new HashMap<>();
        if (result.hasErrors()) {
            List<ObjectError> errors = result.getAllErrors();
            errors.forEach(p -> {
                FieldError fieldError = (FieldError) p;
                log.error("Data check failure : object{ " + fieldError.getObjectName() + " },field{ " + fieldError.getField() +
                        " },errorMessage{ " + fieldError.getDefaultMessage() + " }");
                map.put("Data check failure", fieldError.getObjectName());
                map.put("field", fieldError.getField());
                map.put("errorMessage", fieldError.getDefaultMessage());
                map.put("code", 100);
            });
        }
        return map;
    }

    /**
     * 全局异常捕捉处理
     *
     * @param ex 异常
     * @return 返回错误信息
     */
    @ResponseBody
    @ExceptionHandler(value = Exception.class)
    public Map<String, Object> errorHandler(Exception ex) {
        Map<String, Object> map = new HashMap<>();
        map.put("code", 500);
        map.put("message", ex.getMessage());
        log.error(ex.getClass().getName(), ex);
        return map;
    }

    /**
     * 拦截捕捉自定义异常 MyException.class
     *
     * @param ex 自定义异常
     * @return 返回内容
     */
    @ResponseBody
    @ExceptionHandler(value = MyException.class)
    public Map<String, Object> myErrorHandler(MyException ex) {
        Map<String, Object> map = new HashMap<>();
        map.put("code", ex.getCode());
        map.put("message", ex.getMsg());
        return map;
    }
}

在自定义的时候还需要在单独建一个类,类似于统一返回ResultData这种。我取名为MyEception

@Data
@EqualsAndHashCode(callSuper=false)
public class MyException extends RuntimeException {
    private static final long serialVersionUID = 1L;
    public MyException(Integer code, String msg) {
        this.code = code;
        this.msg = msg;
    }

    private Integer code;
    private String msg;
}

文章提到有EqualsAndHashCode(callSuper=false)这个注解。我就不过多讲解,说句老实话,博主也是才工作一年多的菜鸡,哈哈。只知道大概意思和用法,让我深层讲解的话也困难,写这边文章也只是记录自己学到的东西,然后分享给一些不太清楚的同行。如果要看这个注解的具体含义,可以去Lombok官网看看,
https://blog.csdn.net/qq_27093465/article/details/90056695 博主也推荐这篇文章,将这个注解分析的还是挺不错。

正文到此结束
本文目录