java多catch需按子类到父类顺序排列,避免不可达代码;推荐领域异常分类捕获、合并处理同质异常、自定义语义化异常并包装上下文信息,结合try-with-resources确保资源清理。

Java中用多个catch块处理特定领域异常,核心是“按需区分、精准响应”。不是堆砌catch,而是让每种业务异常有明确归宿,既避免掩盖问题,又便于后续排查和恢复。
按异常具体性从高到低排列
同一try块后多个catch,必须把子类异常写在父类前面。否则编译报错——因为父类catch会提前拦截所有子类异常,导致后续catch永远无法执行。
- 正确顺序:`ArithmeticException` → `IOException` → `Exception`(兜底)
- 错误写法:先写`Exception`再写`ArithmeticException`,后者会被标记为“不可达代码”
- 常见领域示例:处理文件上传时,应优先捕获`FileNotFoundException`,再捕获更宽泛的`IOException`,最后才考虑通用`Exception`
对同质异常合并处理(Java 7+)
当几种异常需要完全一致的响应逻辑(比如统一记录日志、返回错误码),可用竖线(|)在一个catch中并列声明。
- 写法:
catch (SQLException | IOException e) - 限制:这些异常类型之间不能有继承关系,否则编译失败
- 适用场景:微服务调用中,网络超时、连接拒绝、读取中断都统一视为“下游不可用”,走相同降级流程
避免泛化捕获,优先使用领域语义化异常
不要依赖`catch (Exception e)`应付一切。它会吞掉本该暴露的细节,让调试变困难。
- 推荐做法:针对业务环节定义自定义异常,如`InsufficientBalanceException`、`InvalidPromoCodeException`
- 好处:上层调用方能根据异常类型决定是重试、跳过、还是提示用户;日志聚合时也容易按类型统计失败率
- 配合策略:在catch块中不只打印堆栈,而是包装成带上下文信息的新异常再抛出,例如
throw new OrderValidationException("库存不足", orderId, skuId)
资源清理与异常传播要协同设计
多catch不是终点,还要考虑异常发生后资源是否释放、状态是否回滚。
- 优先用
try-with-resources自动关闭流、连接等,比手动finally更可靠 - 若需在catch中做补偿操作(如回滚事务、发告警),确保该操作本身不会抛新异常干扰主流程
- 必要时用
finally做最终保障,但注意其中不要return或抛异常,以免覆盖原异常
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











