【企业标准开发框架 01】全局异常处理+自定义异常类

【企业标准开发框架 01】全局异常处理+自定义异常类

是什么?

【0】 全局异常处理器(统一拦截所有的Controller抛出的异常)

  • 统一拦截异常的机制,保证所有的Controller抛出的异常都可以被捕获,并且标准化的形式返回响应
  • 在Spring Boot中通常使用RestControllerAdvice + @ExceptionHandler 来实现

【1】自定义异常类(业务异常类)

  • 自定义业务的异常类,用来明确表示业务的错误(如:用户不存在,余额不足)
  • 通常包含错误码+错误原因,便于前后端协同

为什么?

为什么必须要这样做,上面已经赘述过了,就是放了方便前后端联调,方便知道是哪里的业务出现了问题!

优点:

  1. 统一性(如果不写比较混乱,前端无法统一处理,写了之后都是{code,message,data} )
  2. 安全性 (如果不写有可能会把内部堆栈、sql信息泄露给用户)
  3. 可维护性(方便定义问题,能够快速知道是哪个模块出现的错误,前端也可以根据错误码给出提示)

怎么做?

步骤
1.自定义业务异常类(BusinessException)
2. 定义枚举类(ErrorCodeEnum)
3. 全局异常处理类(GlobalExceptionHandler)
4. 业务中直接使用throw new BusinessException(…)

自定义业务异常类

01. 枚举类


import lombok.Data;
import lombok.Generated;
import lombok.Getter;


public enum CodeEnum {
   
   



    // 通用
    SUCCESS(0, "成功"),
    SYSTEM_ERROR(1000, "系统异常"),
    PARAM_ERROR(1001, "参数错误"),
    UNAUTHORIZED(1002, "未认证或登录已过期"),
    FORBIDDEN(1003, "没有权限"),

    // 用户模块
    USER_NOT_FOUND(2001, "用户不存在"),
    USERNAME_EXISTS(2002, "用户名已存在"),
    PASSWORD_ERROR(2003, "密码错误");


    private final int code;
    private final String message;
    CodeEnum(int code, String message) {
   
   
        this.code = code;
        this.message = message;
    }
    public int getCode(){
   
   
        return code;
    }
    public String getMessage(){
   
   
        return message;
    }
}

02.自定义异常类
/**
 * @author Soft
 * @version 1.0
 * @description: 自定义异常处理类
 * @date 2025/8/22 11:44
 */
public class BusinessException extends RuntimeException {
   
   
    private final int code;

    
    /** 
     * @author bohai
     * @description: 通过枚举构造 
     * @param:  
     * @return: 
     * @date: 2025/8/22 15:32
     */ 
    public BusinessException(CodeEnum codeEnum){
   
   
        super(codeEnum.getMessage());
        this.code = codeEnum.getCode();
    }

    /**
     0. 在后续的业务中直接使用就可以
     throw new BusinessException(CodeEnum.USER_NOT_FOUND);

     1. 为什么code使用了final?但是message却没有使用final

        原因一:首先RuntimeException继承的是Exception,而Exception又继承Throwable,它里面的message是已经定义好的,而且是没有使用final的!!
        原因二:是因为实际开发中通常也不会修改message,但是又拼接的情况,方便重写message和灵活高效的调试,

     */



    // 直接传入错误码和信息
    public BusinessException(int code, String message) {
   
   
        super(message);
        this.code = code;
    }


    public int getCode() {
   
   
        return code;
    }
}


为什么message不使用final? 上述代码注释中有详细解释!

在这里插入图片描述

03. 统一返回体

/**
 * @author hai
 * @version 1.0
 * @description: 统一返回体
 * @date 2025/8/22 15:55
 */
@Data
public class AjaxResponse<T> extends HashMap<String, Object
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

银河流浪家007

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值