自定义全局异常处理

对于一些小系统来讲,出现异常直接抛就行,甚至不规范的使用。

如果要规范使用,则可以引入自定义异常,统一异常处理和管理,service与controller错误解耦,不会被service返回的类型限制。

场景:

想要抛出异常:

       if (keyIsExist) {
            throw new RuntimeException("短信重复发送!");
            return false;
        }

引入自定义全局异常

步骤:

  1. 定义自定义异常类继承RuntimeException
  2. 统一封装异常处理类
  3. 统一异常拦截处理

定义自定义异常类继承RuntimeException

**
 * 自定义异常
 * 目的:统一处理异常信息
 * 便于解耦,service与controller错误的解耦,不会被service返回的类型而限制
 *
 * @author Claw
 * @date 2023/5/9 21:38.
 */
public class BusinessException extends RuntimeException {
    private ResponseStatusEnum responseStatusEnum;

    public BusinessException(ResponseStatusEnum responseStatusEnum) {
        super("异常状态码为:" + responseStatusEnum.status()
                + ";具体异常信息为:" + responseStatusEnum.msg());
        this.responseStatusEnum = responseStatusEnum;
    }

    public ResponseStatusEnum getResponseStatusEnum() {
        return responseStatusEnum;
    }

    public void setResponseStatusEnum(ResponseStatusEnum responseStatusEnum) {
        this.responseStatusEnum = responseStatusEnum;
    }
}

统一封装异常处理类

/**
 * 优雅的处理异常,统一封装
 * @author Claw
 * @date 2023/5/9 21:38.
 */
public class GraceException {
    public static void display(ResponseStatusEnum responseStatusEnum) {
        throw new BusinessException(responseStatusEnum);
    }
}

统一异常拦截处理

这一步是为了异常被容器捕获拦截,并以json的形式返回给前端。

/**
 * 统一异常拦截处理
 * 可以针对异常的类型进行捕获,然后返回json信息到前端
 *
 * @author Claw
 * @date 2023/5/9 21:40.
 */
@ControllerAdvice
public class GraceExceptionHandler {
    // 拦截 哪种类型的异常,我们需要拦截BusinessException的异常,所以写BusinessException类
    @ExceptionHandler(BusinessException.class)
    // 返回格式为json 
    @ResponseBody
    public GraceJSONResult returnMyException(BusinessException e) {
        e.printStackTrace();
        return GraceJSONResult.exception(e.getResponseStatusEnum());
    }
}

代码中出现的 GraceJSONResult 和 ResponseStatusEnum 一个是自定义的结果返回格式和状态码,自己定义即可。

你可能感兴趣的:(java)