企业级开发中应规范使用runtimeexception:用自定义子类表达业务规则失败,封装受检异常为语义化运行时异常,禁止滥用作流程跳转,并需配合全局异常处理器统一响应。

在企业级应用开发中,RuntimeException 是默认偏好,但绝不是随意使用的兜底方案。它的使用核心在于“表达不可恢复的程序错误或明确的业务规则违反”,而非掩盖逻辑缺陷或替代流程控制。
优先用 RuntimeException 表达业务规则失败
当业务校验明确失败、且该失败属于正常流程中的合法分支时(如“库存不足”“订单已取消”“用户无权限”),应抛出自定义的 RuntimeException 子类(如 InsufficientStockException)。这类异常不是 bug,而是业务语义的一部分,由网关层统一捕获并转为标准 HTTP 响应(如 400 + 错误码)。
- 避免用返回值(如
Result<t></t>)混杂成功与失败逻辑,降低调用方理解成本 - 异常类名即契约——看到异常类型就能判断失败性质,无需解析字符串消息
- 配合错误码枚举(如
ErrorCode.INSUFFICIENT_STOCK),支持多语言、监控统计和前端精准提示
基础设施层必须封装原始受检异常
DAO 层、SDK 调用等底层操作若抛出 SQLException、IOException 等受检异常,不得向上传递。应在持久层或适配器层立即包装为语义清晰的 RuntimeException(如 DataAccessException、ThirdPartyApiCallException)。
- 屏蔽技术细节,避免业务层感知 JDBC 或网络协议差异
- 保留原始异常作为 cause,确保堆栈可追溯
- 添加上下文信息(如 SQL 片段、请求 URL、traceId),便于问题定位
绝对禁止把 RuntimeException 当流程跳转工具
不能因“写起来快”而在服务方法中随意抛出 RuntimeException("参数非法") 或 new RuntimeException()。这类用法破坏调用契约,导致:
应用程序开发设计服务公司网站模板是一款提供应用程序开发、云存储、UX规划、定制等服务的互联网设计公司网站模板下载。提示:本模板调用到谷歌字体库,可能会出现页面打开比较缓慢。
- 调用方无法预判异常类型,只能 catch 所有 RuntimeException,丧失处理针对性
- 日志中全是泛化异常,无法按错误码聚合分析
- 测试覆盖困难,容易遗漏边界分支
真正需要中断流程的业务条件,应通过自定义异常类明确建模,而非依赖通用类型。
全局处理是 Runtime 异常落地的前提
没有统一异常处理器(如 Spring 的 @ControllerAdvice),自定义 RuntimeException 就失去意义。必须做到:
- 拦截所有未捕获的 RuntimeException,转换为结构化响应体(含 code/message/data)
- 对敏感异常(如数据库连接失败)隐藏堆栈,仅记录服务端日志
- 区分错误等级:业务异常(4xx)、系统异常(5xx)、非法访问(401/403)
不复杂但容易忽略。










