当前位置: 首页 > news >正文

自定义错误码的必要性

为什么要使用错误码,直接返回一个错误信息不好么?
下面介绍一下,在程序开发中使用错误码的必要性~

便于排查问题

想象你开了一家奶茶店,顾客下单后可能出现各种问题:

  • 没珍珠了​​(错误码:5001)
  • 杯子不够了​​(错误码:5002)
  • 支付失败​​(错误码:5003)

如果店员直接对顾客喊:“那个…机器坏了(错误码:500)!我也不知道为啥!”,顾客肯定一头雾水。但如果用更加具体的错误码:

  • 顾客看到 ​​“错误码 5001”​​,直接知道 “哦,没珍珠了,换椰果吧”。
  • 老板看到 ​​“错误码 5003”​​,马上检查支付系统。

避免 freestyle、方便统计

对于“用户不存在”这一错误,不同的程序员会有不同的表述,比如:

  • 程序员A写:“用户没找到”
  • 程序员B写:“用户不存在”
  • 程序员C写:“查无此人”

其实都是同一件事,但看起来像三种错误。而用错误码后就可以统一成 ​​“1001”​​,大家看到这个码,都知道是“用户不存在”。

此外,如果老板需要统计由于“用户不存在”导致的错误数量有多少时,就可以通过 “1001” 去搜。

便于多端协作

比如前端、移动端或第三方服务需要根据错误类型执行不同逻辑(如跳转登录页、展示特定提示)。就可以通过错误码约定行为:

if (errorCode == 401) {// 跳转登录页
} else if (errorCode == 403) {// 提示权限不足
}

支持国际化

方法返回错误码,再根据语言环境映射到对应的翻译文本:

// 中文环境
{ "code": 1001, "message": "用户不存在" }// 英文环境
{ "code": 1001, "message": "User not found" }

最佳实践

1.定义错误码枚举类

public enum ErrorCode {SUCCESS(0, "ok"),PARAMS_ERROR(40000, "请求参数错误"),NOT_LOGIN_ERROR(40100, "未登录"),NO_AUTH_ERROR(40101, "无权限"),NOT_FOUND_ERROR(40400, "请求数据不存在"),FORBIDDEN_ERROR(40300, "禁止访问"),SYSTEM_ERROR(50000, "系统内部异常"),OPERATION_ERROR(50001, "操作失败");/*** 状态码*/private final int code;/*** 信息*/private final String message;ErrorCode(int code, String message) {this.code = code;this.message = message;}public int getCode() {return code;}public String getMessage() {return message;}
}

2.方法返回包含错误码信息的通用返回对象

@PostMapping("/add")public BaseResponse<Long> addChart(@RequestBody ChartAddRequest chartAddRequest, HttpServletRequest request) {if (chartAddRequest == null) {throw new BusinessException(ErrorCode.PARAMS_ERROR);}Chart chart = new Chart();BeanUtils.copyProperties(chartAddRequest, chart);User loginUser = userService.getLoginUser(request);chart.setUserId(loginUser.getId());boolean result = chartService.save(chart);ThrowUtils.throwIf(!result, ErrorCode.OPERATION_ERROR);long newChartId = chart.getId();return ResultUtils.success(newChartId);}

3.全局捕获异常

@RestControllerAdvice
@Slf4j
public class GlobalExceptionHandler {// 捕获业务异常(代码编写时主动抛出)@ExceptionHandler(BusinessException.class)public BaseResponse<?> businessExceptionHandler(BusinessException e) {log.error("BusinessException", e);return ResultUtils.error(e.getCode(), e.getMessage());}// 捕获运行时异常,代码编写时未能发现的异常,比如空指针@ExceptionHandler(RuntimeException.class)public BaseResponse<?> runtimeExceptionHandler(RuntimeException e) {log.error("RuntimeException", e);return ResultUtils.error(ErrorCode.SYSTEM_ERROR, "系统错误");}
}

相关文章:

  • Macbook IntelliJ IDEA终端无法运行mvn命令
  • XAML 标记扩展
  • Android端使用无障碍服务实现远程、自动刷短视频
  • 【TeamFlow】4.2 Yew库详细介绍
  • 03-HTML常见元素
  • 衡石科技ChatBI--飞书数据问答机器人配置详解(附具体操作路径和截图)
  • 24、ASP.NET⻚⾯之间传递值的⼏种⽅式
  • 【C++】基于红黑树的map和set封装实现
  • Django 入门指南:构建强大的 Web 应用程序
  • 4.1腾讯校招简历优化与自我介绍攻略:公式化表达+结构化呈现
  • 在springboot3.4.4和jdk17环境下集成使用mapstruct
  • 汽车动力转向器落锤冲击试验台
  • 跳跃游戏(每日一题-中等)
  • 软考 中级软件设计师 考点知识点笔记总结 day14 关系代数 数据库完整性约束
  • 【xlog日志文件】怎么删除里面包含某些字符串的行(使用excel)
  • idea2024.1双击快捷方式打不开
  • 【Docker-16】Docker Volume存储卷
  • 【Java面试笔记:基础】2.Exception和Error有什么区别?
  • 海外版高端Apple科技汽车共享投资理财系统
  • qt 配置 mysql 驱动问题:Cannot load library qsqlmysql;QMYSQL driver not loaded
  • 承认出现误判,以军公布加沙救护车队遭袭事件调查结果
  • “科技+萌点”机器人马拉松刷屏!宇树回应“半马摔倒”
  • 东北三省,十年少了一个“哈尔滨”
  • 加快从数量增长向品质跃升转变,促进生态空间与城市功能有机共生!龚正调研公园城市建设工作
  • 亚太峰会上哪个词最火?我们问了问AI
  • 蚌埠市委常委、宣传部部长郭鹏履新安徽省委宣传部副部长