异常处理
章节简介
本章节介绍系统中常用异常,以及异常处理方式,异常处理逻辑
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": "给定的异常提示"
}
