精准捕获特定异常是为了支撑高可用策略——只对可恢复的瞬时异常(如connectexception、sockettimeoutexception)重试,对timeoutexception或503/504熔断,按异常类型提供差异化降级,并将异常分类嵌入可观测性体系。

精准捕获特定异常不是为了“兜住所有错”,而是为了让重试、熔断、降级这些高可用策略有据可依——只对可恢复的异常重试,只对持续失败的服务熔断,只对明确语义的异常降级。
只捕获可重试的瞬时异常
网络抖动、连接超时、读取超时这类异常具备临时性特征,适合重试;而 4xx 客户端错误、数据校验失败、NPE 等不可恢复异常,重试只会放大问题。
- 推荐捕获:
ConnectException、SocketTimeoutException、ReadTimeoutException、IOException(部分场景) - 避免捕获:
IllegalArgumentException、NullPointerException、HttpClientErrorException(如 400/401)、HttpServerErrorException(如 500 但非超时引起) - 在 Resilience4j 的 Retry 配置中,用
retryExceptions()显式声明重试白名单,而非靠 try-catch 包裹整个调用
用异常类型驱动熔断决策
熔断器不应等“失败次数”堆满才动作,而应结合异常语义提前感知风险。比如连续 3 次 SocketTimeoutException 比连续 3 次 HttpClientErrorException 更值得触发熔断。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 配置 CircuitBreaker 时,通过
failurePredicate定义失败条件:仅当异常是TimeoutException或下游返回 503/504 时计入失败计数 - 避免将
RuntimeException或Exception作为 failurePredicate 的输入,否则业务逻辑异常也会误触发熔断 - 配合指标监控,对不同异常类型分别统计失败率,便于识别是网络层问题还是服务自身崩溃
按异常种类提供差异化降级响应
降级不是统一返回“系统繁忙”,而是根据异常含义返回最合理的兜底结果:超时可返回缓存数据,服务不可用可返回静态模板,参数错误则直接提示用户修正。
- 在
exceptionally()或 fallback 方法中,先做instanceof判断,再分支处理 - 例如:
if (ex instanceof TimeoutException) return cacheService.getFallback();,else if (ex instanceof ServiceUnavailableException) return staticPage.render(); - 确保 fallback 逻辑本身也受保护——对降级方法内部再加轻量级 try-catch,防止降级出错导致链路彻底中断
把异常分类嵌入可观测性链条
异常捕获点要与日志、指标、链路追踪对齐,让每类异常都能被快速定位、归因和干预。
- 在 catch 块中打日志时,固定结构化字段:
error_type=timeout、upstream=payment-service、retry_count=2 - 用 Micrometer 注册异常类型维度的 counter,例如
service.call.failure{type="timeout"} - 在 Sentry 或 Prometheus 中按异常类名聚合告警,而不是只告“调用量下跌”这类模糊信号
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










