java业务异常体系核心是区分业务异常与系统异常,通过bizexception基类及validationexception等子类实现分层;错误码由bizerrorcode枚举统一管理;全局@controlleradvice拦截并返回标准化响应;warn日志记录traceid、errorcode及上下文,配合监控告警与aop参数快照提升可观测性。

Java 中设计一套完整的业务异常体系,核心是区分 业务异常 与 系统异常,让异常可识别、可捕获、可处理、可追溯,并支撑统一的错误响应、日志记录和前端提示。
定义分层的业务异常基类
避免满屏 RuntimeException 或泛化 Exception,应建立清晰的继承结构:
-
BizException:所有业务异常的顶层抽象类,继承
RuntimeException(默认非检查异常,符合业务流程中“预期内失败”的语义) -
ValidationException、AuthException、ResourceNotFoundException 等:按领域语义细分的子类,便于上层
try-catch或全局异常处理器精准识别 - 每个子类可覆写
getErrorCode()、getErrorMessage()方法,或统一由枚举驱动(推荐)
用错误码枚举统一管理业务错误
不把错误信息硬编码在异常构造中,而是通过枚举集中管控,保障一致性、可维护性和国际化基础:
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
- 定义
BizErrorCode枚举,每个实例含code(如"USER_NOT_FOUND")、message(中文默认提示)、httpStatus(如HttpStatus.NOT_FOUND) - 业务异常构造时传入枚举项:
throw new BizException(BizErrorCode.USER_NOT_FOUND) - 后续扩展支持 i18n 时,只需替换 message 获取逻辑,不影响异常抛出点
全局异常处理器统一拦截与响应
使用 @ControllerAdvice + @ExceptionHandler 拦截业务异常,输出标准化 JSON 响应:
- 对
BizException及其子类,提取错误码、消息、HTTP 状态码,封装为统一响应体(如Result.fail(code, message)) - 对
MethodArgumentNotValidException等框架级校验异常,解析BindingResult,映射为VALIDATION_FAILED错误码并聚合字段错误 - 对未捕获的
Exception(即系统异常),记录完整堆栈、打告警日志,返回通用错误码(如"SYSTEM_ERROR"),**绝不暴露敏感信息给前端**
配合日志与监控增强可观测性
异常不是抛出去就结束,要让问题可定位、可归因:
- 在全局异常处理器中,对所有业务异常记录
WARN日志,包含 traceId、errorCode、业务上下文(如 userId、orderId) - 对重复高频的错误码(如每分钟超 10 次
"PAY_TIMEOUT")触发监控告警 - 在关键服务入口(如 Service 方法)加 AOP 切面,自动捕获并记录业务异常发生位置、参数快照(脱敏后),辅助复现
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










