Scaffold-Boot-3.0框架使用文档Scaffold-Boot-3.0框架使用文档
首页
快速开始
变更记录
Source
首页
快速开始
变更记录
Source
  • 开始
  • 基础

    • 目录结构
    • 代码生成器
    • 增删改查
    • 异常处理
    • Knife4j(Swagger)文档
    • 登录&登出
    • 系统安全
    • 数据字典
    • Excel处理
    • 文件上传下载
    • 工具类
    • 定时任务
    • 微信集成
    • 短信服务
    • 参数配置
    • 接口限流
    • 日志审计
    • 数据脱敏
    • 网站管理
  • AI开发

    • AI项目工程结构
    • MCP服务
    • AI开发模式介绍
  • 开发规范
  • 常见问题
  • 深入

    • 配置详解-Config类
    • 配置详解-Yml配置文件
  • 生命周期

    • SonarQube代码质量保证
    • 部署到测试环境
    • 部署到正式环境
  • 优秀案例

    • Excel导入完整案例
  • 信创专区

    • 海量数据库
    • 神通数据库
    • 达梦数据库
    • 麒麟v10安装插件
  • 框架升级

异常处理

章节简介

本章节介绍系统中常用异常,以及异常处理方式,异常处理逻辑

BusinessException介绍

1、BusinessException 继承自 RuntimeException,封装了错误码和消息,主要用于业务抛出异常,便于全局异常处理捕获后按格式统一返回给前端
2、当业务需要终止时,请抛出 BusinessException,并传入错误码(ResultCode)和明确且友好的提示消息,告知用户业务所遇到的问题

警告

如需数据回滚请务必使用 throw new BusinessException 抛出业务异常,并传入错误码和消息

ResultCode介绍

ResultCode 封装了返回码常量,便于 BusinessException 使用
1、code = 0 即 ResultCode.OK 表示成功,其余均为失败
2、以下几种异常码,为保留异常码,建议无特殊情况,不使用

// 以下三个常量类,表示未登录或无权限,建议无特殊情况,不使用
public static final int UNAUTHORIZED = 401;
public static final int TOKEN_ERROR_CODE = 40101;
public static final int TOKEN_FORBIDDEN_CODE = 40301;

3、其余非0错误码均为自定义异常,可根据实际业务自己定义code

业务异常使用

1、抛出异常示例,如下,注意不要使用ResultCode.OK 或 0 作为错误码,因为会被全局异常捕获器认为是成功

//以ResultCode方式抛出异常
throw new BusinessException(ResultCode.FAIL, "具体的错误信息");
//以自定义code方式抛出异常
throw new BusinessException(-2, "具体的错误信息");

2、运用 BusinessException 抛出异常

// 优秀案例
public void exchange(Goods entity) {
    // 业务逻辑省略
    // 扣除库存
    int stock = goodsService.queryStockNum(entity.getGoodsId());
    if (stock < 1) {
        throw new BusinessException(ResultCode.FAIL, "库存不足");
    }
    //余额判断
    BigDecimal balance = balanceService.queryBalance(entity.getUserId());
    if (balance.compareTo(entity.getPrice()) < 0) {
        throw new BusinessException(ResultCode.FAIL, "余额不足");
    }
    // 保存兑换记录
    exchangeRecordService.save(entity);
}

// 常见错误案例,运用boolean值去表示业务异常,请问boolean为false时,到底代表什么意思???
// 是库存不够,还是钱不够?
// 而且这种方式,业务不会回滚
public boolean exchangeVeryBadCase(Goods entity) {
    // 业务逻辑省略
    // 扣除库存
    int stock = goodsService.queryStockNum(entity.getGoodsId());
    if (stock < 1) {
        return false;
    }
    //余额判断
    BigDecimal balance = balanceService.queryBalance(entity.getUserId());
    if (balance.compareTo(entity.getPrice()) < 0) {
        return false;
    }
    // 保存兑换记录
    exchangeRecordService.save(entity);
    return true;
}

系统全局异常处理

系统通过GlobalExceptionHandler全局异常捕获器,统一处理系统异常,常见异常如下:

提示

请不要过度依赖异常捕获机制,在业务中,例如数据重复问题时,应该自己通过查询数据库判断,然后抛出 BusinessException 异常,而不是依赖系统捕获器,更不要依赖数据库中的唯一约束校验。

1、主键重复异常(DuplicateKeyException),返回格式如下

{
    "code": -1,
    "success": false,
    "message": "数据重复,请检查"
}

2、数据长度异常(DataIntegrityViolationException),返回格式如下

{
    "code": -1,
    "success": false,
    "message": "数据有误,请检查是否数据长度过长或不完整"
}

3、文件超过最大限制异常(MaxUploadSizeExceededException),返回格式如下

{
    "code": 400,
    "success": false,
    "message": "文件超过最大限制:"
}

4、接口不存在异常(NoHandlerFoundException),返回格式如下

{
"code": 404,
"success": false,
"message": "接口不存在,请检查路径是否正确"
}

5、其他异常,返回格式如下

{
    "code": -1,
    "success": false,
    "message": "代码里实际抛出的异常的getMessage()信息"
}

6、业务异常,返回格式如下

{
    "code": ResultCode值,
    "success": false,
    "message": "给定的异常提示"
}
在 GitLab 上编辑此页
最后更新: 2025/6/16 17:13
贡献者: xuew, wangming
Prev
增删改查
Next
Knife4j(Swagger)文档