面向对象异常体系的核心是让错误承载语义、携带上下文、可分类追踪,通过枚举定义错误身份(如usererrorcode.user_not_found)、自定义异常类封装元数据、全局拦截统一响应,并兜底非web场景避免静默丢失。

直接把一堆散落的错误码字符串、if-else 判断、手动拼 JSON 的返回逻辑,换成真正面向对象的异常体系,核心不是“换写法”,而是重新定义错误在系统里的角色:它得承载语义、携带上下文、可分类、可追踪、不污染业务主干。
用枚举统一错误身份,别再硬编码数字或字符串
错误码不是编号,是业务意图的身份证。抛弃 "ERR_001" 或 5001 这类裸值,定义带模块前缀和语义的枚举:
- UserErrorCode.USER_NOT_FOUND("U1001", "用户不存在") —— 模块标识(U)、序号、中文提示全固化
- 所有枚举实现统一接口
ErrorCode,强制提供getCode()和getMessage() - 前端可直接用
code做 i18n 映射或 toast 分支,不用再解析 message 字符串
自定义业务异常类,把错误变成可携带元数据的对象
不再 throw new RuntimeException("库存不足"),而是创建一个真正有结构的异常:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 继承
RuntimeException,不强制上层 try-catch,保持业务流自然 - 构造时必须传入
ErrorCode枚举,自动绑定 code/message - 支持扩展字段:
details: Map<string object></string>(如{"skuId": "S123", "available": 0}) - 保留原始 cause(比如 DAO 抛出的 SQLException),确保根因可追溯
全局拦截 + 分层响应,让 Controller 彻底“无异常感”
Controller 方法签名里不再出现 throws,也不写任何 try-catch 封装返回体:
- 用
@RestControllerAdvice集中拦截BusinessException及其子类 - 每个
@ExceptionHandler方法只处理一类异常,返回标准Result.fail(errorCode) - HTTP 状态码按语义映射:400(参数错)、404(资源不存在)、409(状态冲突)、500(系统异常)
- 响应体只含
code、message、timestamp和可选requestId,绝不暴露堆栈或 cause
补全非 Web 场景兜底,避免异常静默丢失
@RestControllerAdvice 管不到定时任务、线程池、异步回调等场景:
- 在应用启动时设置
Thread.setDefaultUncaughtExceptionHandler - 该处理器只做三件事:记录带 traceId 的完整日志、触发告警、保存关键上下文(如 jobId、userId)
- 不构造 HTTP 响应,也不尝试“恢复”,只确保问题不被吞掉
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










