优雅 的全局异常处理

119 阅读2分钟

这是我参与「掘金日新计划 · 8 月更文挑战」的第29天,点击查看活动详情

前言

在实际开发中异常随处可见 数组越界(ArrayIndexOutOfBoundsException) 空指针(NullPointerException) 类型转换(NumberFormatException)算数异常例如:10/0(ArithmeticExecption) 等异常,实际开发中都需要处理这些异常。本文在springboot中全局处理异常(异常常见的处理方式分为 try{}catch(){} 自己处理掉,和第二种方式向上抛出throw 由调用者进行处理)。

第一步我们先创建我们的异常类

我们的异常类是需要继承RuntimeException这个类 因为RuntimeException继承了 Exception顶级的异常类再往下走就是 父类 Throwable(异常的)。整体可以分为两类 运行时异常(就是不会自己检验只有程序执行中才会抛出) 和 其他异常。

/**
 * @ClassName: MyException
 * @Aythor: Mr_xk
 * @Date: 2021/8/1 14:43
 * @Version: 1.0
 **/
@Data
public class MyException extends RuntimeException{
    private Integer code;//状态码
    private String msg;//异常信息

    public MyException(String msg){
        super(msg);
        this.msg=msg;
    }
    public MyException(String msg, Throwable throwable){
        super(msg,throwable);
        this.msg=msg;
    }
    public MyException(Integer code, String msg){
        super(msg);
        this.msg=msg;
        this.code=code;
    }
    public MyException(Integer code, String msg, Throwable throwable){
        super(msg,throwable);
        this.msg=msg;
        this.code=code;
    }
}

说到全局异常不得不提到 springboot为我们 提供的 @RestControllerAdvice这个注解 是由 @ControllerAdvice@ResponseBody组成的 配合 @ExceptionHandler注解使用,下面我们贴一下我们的处理类。可以看到可以在里面捕获各种的异常并且对单独一种做处理。

@RestControllerAdvice
@Slf4j
public class GlobalExceptionHandler {
    //自定义异常
    @ExceptionHandler(MyException.class)
    public R error(MyException e) {
        e.printStackTrace();
        return R.error().message(e.getMsg());
    }
    //指定出现什么异常执行这个方法
    @ExceptionHandler(Exception.class)
    public R error(Exception e) {
        e.printStackTrace();
        log.error("异常信息"+e);
        return R.error().message(e.getMessage());
    }
    @ExceptionHandler(ExpiredJwtException.class)
    public R error(ExpiredJwtException e) {
        e.printStackTrace();
        return R.error().message("token令牌过期..");
    }
}

当然使用也是很简单,只需要在抛出这些异常就会被捕获到,并封装对应的放回数据(当然业务场景不一样分情况而定)当然优雅的处理异常和捕获还是很舒服的可以通过这个做很多事情比如我们可以在重要的业务中抛出一个自定义的异常,当捕获到时可以做预警处理等等操作.....(做过一个邮件报警就是用这个思路做的😃😃)

实践是检验真理的唯一准则,感兴趣的可以去试试呀!明天见咯 😃😃😃😃