生产环境异常处理需打通捕获→记录→分类→告警→追踪→复盘全链路,通过全局拦截、结构化日志、分级告警、链路追踪实现可定位、可度量、可响应。

Java 生产环境的异常处理不能只靠 try-catch,必须打通「捕获 → 记录 → 分类 → 告警 → 追踪 → 复盘」全链路。核心是让异常从“被吞掉”变成“可定位、可度量、可响应”。
统一全局异常拦截:避免漏捕和重复捕获
Spring Boot 项目应使用 @ControllerAdvice + @ExceptionHandler 拦截控制器层异常,但需注意三点:
- 只拦截
RuntimeException和业务自定义异常(如BusinessException),不建议直接捕获Exception,否则可能吞掉OutOfMemoryError等致命错误 - 配合
@ResponseStatus或手动设置 HTTP 状态码,确保前端能区分 4xx(客户端错误)和 5xx(服务端异常) - 非 Web 场景(如定时任务、消息监听器)需单独配置
Thread.setDefaultUncaughtExceptionHandler,防止线程内异常静默丢失
结构化日志记录:带上下文、可检索、防敏感
异常日志不是简单打印堆栈,而是要包含可追溯的业务上下文:
- 使用 SLF4J + Logback(或 Log4j2),配置
%X{traceId}等 MDC 字段,在请求入口(如 Filter)注入唯一 traceId,确保异常日志与调用链对齐 - 记录关键业务字段(如订单号、用户ID),但需脱敏——用工具类统一替换手机号、身份证等,禁止直接拼接明文到日志
- 避免在日志中记录大对象 toString() 或完整 request body,易导致日志膨胀甚至 OOM;改用摘要(如 MD5)、长度限制(
StringUtils.abbreviate(str, 200))
分级告警与监控联动:不让告警变噪音
不是所有异常都要发企业微信/电话,需按影响面分级:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
- ERROR 级别:系统级异常(如 DB 连接失败、Redis 超时)、高频业务异常(每分钟 >5 次的支付失败),触发即时告警(企微+短信)
- WARN 级别:预期外但可降级的异常(如第三方接口超时后走缓存),聚合统计后每日邮件通报
- 接入 Prometheus + Grafana:用 Micrometer 暴露
exception_occurred_total{type="DatabaseException", service="order"}指标,实现按异常类型、模块、HTTP 状态码多维下钻
链路追踪闭环:从告警直达根因代码行
单靠日志无法快速定位分布式调用中的异常源头:
- 集成 SkyWalking 或 Pinpoint,确保异常发生时自动打点并携带 error tag,前端告警附带 traceId 链接
- 在全局异常处理器中,主动上报异常信息到 APM(如 SkyWalking 的
TraceContext.captureException()),补全日志未覆盖的异步线程、RPC 上下文 - 结合 ELK 或 Loki:在 Kibana 中用
traceId: "abc123" AND level: "ERROR"一键查全链路日志,无需跨服务翻找
不复杂但容易忽略的是:定期清理无效告警规则、校验 MDC 上下文传递完整性、验证异步场景(@Async、CompletableFuture)的日志归属。真正的生产级异常治理,是让每一次报错都成为一次可执行的改进机会。

















