java多catch块应按治理意图分组,每个块承载明确职责;子类异常必须前置;共性逻辑需抽离复用;合并捕获仅适用于响应一致的并列异常类型。

Java多catch块不是堆砌语法,而是把异常响应拆成可维护、可复用、不遮蔽的模块。关键在分组逻辑清晰、处理动作明确、资源善后独立。
按治理意图分组,不是按异常类型罗列
每个catch块应承载一个明确的业务或系统职责,而不是单纯对应某类异常:
- 业务校验失败(如IllegalArgumentException)→ 返回用户提示码、填充默认值、跳过后续流程
- 外部依赖故障(如IOException、SQLException)→ 触发重试、降级策略、事务回滚
- 不可预期异常(如Exception)→ 仅记录全栈日志、触发告警、避免静默吞掉
子类必须前置,编译器强制保障分级有效性
顺序不是经验之谈,是编译期硬约束:
- FileNotFoundException 必须写在 IOException 前面,否则编译报错“已捕获”
- ArithmeticException 和 NullPointerException 可并列,因无继承关系,顺序不限
- 兜底的 catch (Exception e) 一定放在最后,且不应成为默认出口
共性逻辑抽离,保留差异又避免重复
真实场景中,多数异常既要专属动作,也要共性收尾:
- 在 SQLException 块里执行
rollback(),再调用logAndCleanup(e, "db") - 在 IOException 块里关闭临时文件句柄,再调用同一
logAndCleanup(e, "io") - 私有方法封装日志、监控打点、上下文清理,不耦合具体异常类型
Java 7+ 合并用对场景,不为省代码而合并
竖线语法 catch (IOException | SQLException e) 仅适用于真正一致的响应:
- ✅ 允许:两者都需关闭连接 + 记录错误指标 + 返回统一HTTP状态码
- ❌ 禁止:IOException 和 EOFException 合并,后者是前者子类,编译失败
- ⚠️ 注意:合并后变量
e类型为 Exception,无法调用e.getSQLState()等子类方法
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











