核心是用自定义异常类封装错误码并在全局处理器中精准捕获转为统一响应。定义继承runtimeexception的businessexception,通过枚举管理错误码,service层主动抛出,@restcontrolleradvice中专案专办,返回result.fail并匹配4xx状态码。

核心是用自定义异常类封装错误码,再在全局处理器中精准捕获并转成统一响应格式。不靠 try-catch 散布各处,也不用泛泛捕获 Exception。
定义带业务码的自定义异常
继承 RuntimeException,避免强制 try-catch;构造时传入枚举或具体 code/msg,确保语义清晰、可扩展。
- 推荐用枚举管理错误码(如 ResultCode.USER_NOT_EXIST),避免数字硬编码
- 异常类里保留 code 和 msg 字段,并提供带参/无参构造方法
- 可选:支持占位符(如 "用户 {0} 不存在"),通过 String.format 动态填充
在业务逻辑中主动抛出
不是等空指针或 SQL 异常发生才处理,而是明确判断后“优雅失败”。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- Service 层校验不通过时直接 throw new BusinessException(ResultCode.USER_NOT_EXIST)
- 避免在 Controller 层做判断抛异常,保持分层职责清晰
- 异常信息应面向用户友好,比如“手机号已被注册”,而非“DuplicateKeyException”
全局处理器中专案专办
@RestControllerAdvice 里为 BusinessException 单独写一个 @ExceptionHandler 方法,不做兜底混用。
- 方法参数接收 BusinessException 类型,直接取 e.getCode() 和 e.getMsg()
- 返回值统一用项目约定的 Result.fail(code, msg),和正常成功响应结构一致
- 不在此处记录日志(业务异常非系统故障),如有需要可在抛出前由 Service 记录
确保 HTTP 状态码合理匹配
业务错误不等于服务崩溃,状态码别一概用 500。
- 参数错、资源不存在、权限不足等——对应 4xx 状态码(如 400、404、403)
- 使用 ResponseEntity.status(code).body(result) 显式设置,或在 Result 封装时绑定
- 前端可通过 HTTP 状态码快速区分客户端问题 vs 服务端故障










