java受检异常必须显式处理:捕获时需记录完整堆栈(如logger.error("msg", e)),不可仅记getmessage();应遵循“捕获即处理”原则,恢复业务、包装重抛或声明throws委托上层;优先使用try-with-resources管理资源。

Java 中受检异常(Checked Exception)必须显式处理,不能忽略。捕获后记录日志是常见做法,但要注意:不能只记日志就完事,必须遵循“捕获即处理”原则——要么恢复业务逻辑,要么包装后重新抛出,避免静默吞异常。
用 try-catch 捕获并记录日志
最直接的方式是在 catch 块中使用日志框架(如 SLF4J)记录异常详情。注意要记录 完整堆栈信息,不能只打 getMessage()。
- ✅ 正确写法:logger.error("文件读取失败", e); —— 自动包含堆栈
- ❌ 错误写法:logger.error("文件读取失败: " + e.getMessage()); —— 丢失堆栈,难排查
不要“吃掉”受检异常
受检异常代表可预期的外部问题(如 IO、SQL、网络),仅记录日志却不做任何业务响应,会导致调用方无法感知失败。
- 若当前层无法恢复,应包装为运行时异常再抛出:throw new RuntimeException("配置加载失败", e);
- 若属于业务可处理场景(如文件不存在),可转为默认值或提示信息,而非抛异常
- 避免空 catch 块或只写 logger.error(...) 后不抛不返
结合 throws 委托上层处理
不是所有地方都适合捕获。如果当前方法无法决定如何应对 IOException 或 SQLException,更合理的方式是声明 throws,并让调用方统一处理。
- 例如 service 方法不直接 catch SQLException,而是 throws,由 controller 或统一异常处理器拦截
- 配合 @ControllerAdvice 或 try-with-resources 可减少手动捕获负担
使用 try-with-resources 自动管理资源 + 异常处理
针对带资源的受检异常(如 FileReader、Connection),优先用 try-with-resources,它会自动关闭资源,并把可能的异常合并到主异常中。
- 示例:try (FileInputStream fis = new FileInputStream("a.txt")) { ... } —— 即使读取时抛异常,fis 也会被关闭
- 若 try 和 close 都抛异常,close 的异常会被抑制(可通过 e.getSuppressed() 获取)
- 仍需在 catch 中记录主异常,必要时检查抑制异常
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











