文件读写异常处理需用logger.error("描述", path, e)传异常对象和上下文参数,避免拼串或printstacktrace;日志配置须含%ex,mdc补充traceid等上下文,路径要脱敏,自定义异常须保留cause链。

在文件读写异常处理中,既要保留完整的堆栈信息,又要带上文件路径等业务上下文,关键在于三件事:用对日志方法、传对参数、配对日志格式——而不是拼字符串或调用 e.printStackTrace()。
用 logger.error("描述", e) 传异常对象,别拼接
SLF4J/Logback 等框架只有识别到 Throwable 类型的最后一个参数,才会自动展开完整堆栈(含 cause 链、suppressed 异常)。文件操作出错时,应这样写:
- ✅ 正确:
logger.error("读取配置文件失败, path={}", configPath, e); - ❌ 错误:
logger.error("读取配置文件失败: " + e.getMessage(), e);—— 可能 NPE,且重复 message - ❌ 错误:
logger.error("读取配置文件失败: {}", e);—— e 被当普通对象格式化,堆栈彻底丢失 - ❌ 错误:
e.printStackTrace();—— 输出到 System.err,无上下文、不可控、不进日志系统
把文件路径等关键信息作为占位符参数传入
路径、文件名、编码方式这些是定位问题的核心线索,必须和异常绑定在同一行日志里,方便检索与关联分析:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 记录读取操作:
logger.error("加载模板文件失败, path={}, charset={}, line={}", templatePath, "UTF-8", lineNumber, e); - 记录写入操作:
logger.error("写入日志文件失败, target={}", backupFile.getAbsolutePath(), e); - 避免手动拼接:
"path=" + path + ", error=" + e—— 破坏结构化,影响 ELK 解析,也容易漏脱敏
确保日志配置输出完整堆栈,并启用 MDC 补充全局上下文
光代码写对还不够,日志输出端要能“显示”堆栈:
- Logback 的
<pattern></pattern>中必须包含%ex(推荐)或%xEx(带 MDC);例如:%d{HH:mm:ss.SSS} [%thread] %-5level [%X{traceId}] %logger{36} - %msg%n%ex - 若需展开深层 cause(比如
IOException套着FileNotFoundException),用%ex{5}指定最大深度 - 在请求入口(如 Filter 或 Spring Interceptor)中注入 MDC:
MDC.put("filePath", path);,后续所有日志自动携带,无需每处重复传参 - 务必在 finally 或 try-with-resources 结束后调用
MDC.clear(),防止线程复用污染
敏感路径要脱敏,异常链不能切断
文件路径可能含环境变量、用户目录或临时路径,需提前过滤:
- 对
/home/xxx/.ssh/id_rsa、C:\Users\Admin\app\config.key这类路径做正则替换或掩码处理 - 自定义异常包装时,必须用
super(msg, cause)构造器,保留原始 cause;不要用new RuntimeException(e)或e.initCause(...) - 捕获
IOException后若需转为业务异常,写成:throw new FileLoadException("配置加载异常", e);,而非仅抛新消息
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










