在 async 函数中无法部分捕获失败,需通过 .catch()、Promise.allSettled() 或封装 safeAwait/attempt 等方式将错误提前拦截并转为成功结果,避免 await 抛出中断执行。

在 async 函数中,你不能“部分捕获”失败——await 一旦遇到 Promise.reject() 就会立即抛出异常,中断后续执行。但你可以通过控制 Promise 的状态流转,让某些失败不中断流程,而是转为可处理的返回值(比如 null、undefined 或带 error 字段的对象)。核心思路是:**不让错误冒泡到 await,而是提前用 .catch() 或 try/catch 拦截并转化为成功结果**。
用 .catch() 把失败转成默认值
对单个 Promise 调用 .catch(),让它始终 resolve:
-
await fetch('/api/user').catch(() => null)→ 请求失败时返回null,不会 throw -
await someAsyncFn().catch(err => ({ success: false, error: err.message }))→ 统一返回结构化结果
并发请求中容错:Promise.allSettled()
当你要同时发起多个异步操作,并接受其中部分失败时,Promise.allSettled() 是最直接的选择:
- 它不会因某个 Promise reject 而中断,而是等待全部完成,返回每个 Promise 的
{ status, value }或{ status, reason } - 示例:
const results = await Promise.allSettled([ fetch('/api/a'), fetch('/api/b'), fetch('/api/c') ]);<br>results.forEach((r, i) => { if (r.status === 'fulfilled') console.log(`第${i}个成功:`, r.value); else console.warn(`第${i}个失败:`, r.reason); });
封装成可选 await 工具函数
写一个通用的 safeAwait,让调用更简洁:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
async function safeAwait(promise, defaultValue = null) { try { return await promise; } catch (err) { return defaultValue; } }<br>// 使用<br>const user = await safeAwait(fetch('/user'), { id: -1, name: 'anonymous' });- 也可返回
{ data, error }形式,类似 Go 或 Rust 的 Result: async function attempt(promise) { try { const res = await promise; return { ok: true, data: res }; } catch (err) { return { ok: false, error: err }; } }<br>const res = await attempt(fetch('/data')); if (res.ok) useData(res.data); else handleErr(res.error);
注意:不要滥用 try/catch 包裹整个 async 函数体
虽然可以写:
async function handler() { try { const a = await step1(); const b = await step2(); // 如果 step1 成功但 step2 失败,b 就拿不到 return { a, b }; } catch (e) { return { error: e.message }; // 整体失败,无法知道哪一步出了问题 } }- 这适合“全有或全无”的场景;若需细粒度控制每一步成败,请把
try/catch拆到每个 await 前,或用上面的.catch()/safeAwait方式
关键不是“在 async 里捕获部分失败”,而是主动设计 Promise 链,让失败不出现在 await 的左侧。本质上,是把“错误处理”提前到 Promise 构建阶段,而非依赖 await 的异常机制。

















