Java异常分级处理的核心是按继承关系从具体到宽泛排列catch块,确保精确异常优先捕获;结合业务语义区分可恢复与不可恢复异常,并通过自定义异常体系增强语义表达和职责分离。

Java异常处理中,针对不同错误类型进行分级处理的 catch,核心在于利用多层 catch 块按异常类继承关系从具体到宽泛排列,确保更精确的异常能被优先捕获和针对性处理。
按继承顺序从子类到父类写 catch
Java 的异常类是树状继承结构(如 IOException ← Exception ← Throwable),编译器要求更具体的异常类型必须放在更宽泛的前面,否则会报错“Unreachable catch block”。
- 先写
catch (SQLException e),再写catch (IOException e),最后写catch (Exception e) - 不能把
Exception放在NullPointerException前面,否则后者永远无法被捕获 - 若需统一兜底,
catch (Throwable t)必须放在所有catch最末尾(通常不推荐,除非做日志或 JVM 级容错)
按业务语义分层:可恢复 vs 不可恢复
不是所有异常都该用同一种方式处理。分级 catch 的本质是区分“还能继续跑”和“必须终止流程”的场景。
分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。
- 可恢复异常(如网络超时、文件暂不可读):单独 catch,加重试逻辑或降级返回默认值
-
数据/业务违规(如
IllegalArgumentException、自定义InvalidOrderException):捕获后记录上下文,向调用方返回明确错误码或提示 -
系统级崩溃风险(如
OutOfMemoryError、NoClassDefFoundError):一般不 catch,让 JVM 或容器接管;若必须捕获,仅用于紧急日志和资源清理
配合 finally 和 try-with-resources 控制资源生命周期
分级 catch 不等于只关注异常类型,还要保证资源安全释放。尤其在多 catch 场景下,避免因某个分支遗漏清理导致泄漏。
立即学习“Java免费学习笔记(深入)”;
- 使用
try-with-resources自动关闭实现了AutoCloseable的资源(如FileInputStream、Connection),比手动finally更可靠 - 若必须手写
finally,注意其中不要抛出新异常,否则会掩盖原始异常;如需记录,用addSuppressed()关联 - 数据库操作中常见组合:
catch (SQLTimeoutException e)做重试,catch (SQLIntegrityConstraintViolationException e)转业务错误,finally关闭Statement和Connection
用自定义异常增强分级语义
JDK 异常类型有限,业务逻辑复杂时,靠标准异常难以清晰表达意图。定义层级化的自定义异常能让 catch 更具可读性和可维护性。
- 设计异常继承体系,例如:
BusinessException(父类)→PaymentException→InsufficientBalanceException - 每个子类可携带特定错误码、HTTP 状态码、是否可重试等元信息
- Controller 层统一 catch
BusinessException返回 JSON 错误响应,而底层 service 只抛具体子类,保持职责分离

















