async/await 调用 fs.promises 方法会以 promise 拒绝形式抛出错误,必须用 try/catch 捕获;读写文件需分别处理路径、权限、编码、目录创建及遍历校验;批量操作推荐 promise.allsettled 实现“尽力而为”;可通过封装工具函数和全局监听器统一错误处理。

直接用 async/await 调用 fs.promises 的方法时,错误不会被静默吞掉,而是以 Promise 拒绝(rejected)形式抛出,所以必须用 try/catch 捕获——这是和回调写法最本质的区别。
读文件出错:用 try/catch 捕获常见异常
fs.promises.readFile 在路径不存在、权限不足、编码不匹配等情况下会直接 reject,抛出 Error 实例。错误对象通常含 code(如 'ENOENT'、'EACCES')和 errno 字段,可用于精细化处理:
- 检查
err.code === 'ENOENT'可区分“文件不存在”和其他错误,比如提示用户先创建文件 - 遇到
'EISDIR'表示传入的是目录而非文件,可主动提醒路径类型错误 - 若指定了
encoding(如'utf8'),但文件含非法字节,会抛'ERR_INVALID_ARG_VALUE'或解码失败错误,建议加throwOnUnicodeError: true显式控制
写文件出错:注意目录是否存在与权限问题
fs.promises.writeFile 不会自动创建父目录。如果 /logs/app.log 中 /logs 不存在,会报 'ENOENT'。安全做法是先用 fs.promises.mkdir(..., { recursive: true }) 确保路径就绪:
将一个或多个视频上传至YouTube。当用户想“上传到YouTube”“发YouTube”“批量上传”“upload to YouTube”“post videos to YouTube”或发布到YouTube时使用此技能。
- 把
mkdir和writeFile放在同一个try块里,或用await串行调用 - 写入时加
flag: 'a'追加模式,避免覆盖;加mode: 0o644显式设权限,防止因 umask 导致不可读 - 对敏感路径(如用户上传),务必校验文件名是否含
../等遍历字符,否则writeFile可能误写系统关键位置
批量操作出错:单个失败不影响其余,需单独捕获
多个 fs.promises 调用并行(如 Promise.all([read1(), read2()]))时,任一拒绝会导致整个 Promise 失败。如需“尽力而为”,改用 Promise.allSettled:
- 每个结果是
{ status: 'fulfilled', value }或{ status: 'rejected', reason } - 可遍历结果,只处理成功的数据,对失败项记录日志或重试,不中断流程
- 若顺序强依赖(如先读再写),坚持用
await串行,避免竞态和中间状态残留
统一错误处理:封装成带默认行为的工具函数
重复写 try/catch 易出错,可封装一层:
- 例如
safeReadFile(path, options = {})内部try执行readFile,catch后返回{ ok: false, error: err }结构 - 或用高阶函数
withRetry(fn, max = 3)对临时性错误(如 EBUSY)自动重试 - 在入口层(如 Express 路由)用全局
unhandledRejection监听器兜底,记录未被捕获的 Promise 错误,避免进程意外退出
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










