异常与错误模型硬核实践:语义分层、跨界映射、抑制异常与观测闭环
大约 3 分钟
异常与错误模型硬核实践:语义分层、跨界映射、抑制异常与观测闭环
新手先看 · 一屏速览
- 受检用于“调用方能且应当处理”,运行时异常用于编程错误/不可恢复
- 异常层级语义化;在边界层压缩异常面,避免泄漏实现细节与内部栈
- try-with-resources 自动关闭;关闭过程中产生的异常被标注为 suppressed
1. 受检 vs 非受检:边界选择
- 受检(
IOException等):方法签名显式声明,调用方必须处理或继续抛出 - 非受检(
RuntimeException):编程错误、前置条件违背(如 NPE/IAE)、不可恢复系统状态
工程裁剪:对外部世界(I/O/网络)常用受检向上显化,对内部不变量违背使用运行时异常快速失败
2. 层次与语义
- 建立语义清晰的异常层次(如
DomainException、ValidationException、ExternalServiceException) - 内部保留 cause 链便于定位;对外暴露统一错误响应(错误码/可本地化信息)
sealed class AppException extends RuntimeException permits DomainException, ExternalServiceException {}
final class DomainException extends AppException { /* ... */ }
final class ExternalServiceException extends AppException { /* ... */ }3. 资源管理与抑制异常
try (var in = Files.newBufferedReader(path, StandardCharsets.UTF_8)) {
return in.readLine();
}- try-with-resources 自动关闭资源;关闭失败产生的异常会被标记为 suppressed,可通过
ex.getSuppressed()获取 - 在 finally 手动关闭时,注意保留并附加 suppressed,避免吞掉根因
4. 日志与观测
最近建一些几十个工作内推群,各大城市都有,群里目前已经收集了很多内推岗位,大厂、中厂、小厂、外包都有。 欢迎HR、开发、测试、运维和产品加入。

扫描下方微信,备注:网站+所在城市,即可拉你进工作内推群。

- 在边界层统一记录一次完整堆栈(避免重复日志);内部仅包装与 rethrow
- 使用 MDC/结构化日志打标签(traceId/userId/订单号);接入告警系统与分布式追踪
- 为可预期异常降级日志级别(如业务校验 WARN),减少噪声
5. 错误码与异常边界
- 对外协议(REST/RPC)以错误码/语义稳定;内部用异常组织控制流与上下文
- 在边界层做映射:异常 → 错误码/文案(可国际化);避免泄漏内部类名与堆栈
- 对一致性敏感操作(转账/库存)确保幂等与补偿,与异常策略协同
6. 实战清单与反模式
- 清单:统一异常基类与层级;try-with-resources 规范;跨层边界做映射与压缩
- 清单:只在一个位置记录堆栈;MDC/traceId 打通观测;错误码体系与国际化
- 反模式:吞异常;空 catch;重复日志;在热路径用异常作为普通控制流
7. 练习
- 设计一套异常层次,覆盖“验证失败/外部服务失败/系统错误”,并编写边界层映射
- 编写一个工具:统一包装 I/O 异常,并确保日志与抑制异常可见
