try...catch仅能捕获await的Promise拒绝,无法捕获未await的Promise拒绝;fetch需手动检查res.ok并throw才能触发catch;并行请求推荐用Promise.allSettled避免错误传播。
在 JavaScript 异步函数中,try...catch 只能捕获同步错误和 await 表达式中被拒绝的 Promise,不能直接捕获未 await 的 Promise 拒绝(比如忘记 await 的 fetch() 调用)。关键在于:只有被 await 的 Promise 拒绝时,才会抛出异常并进入 catch 块。
当使用 await 等待一个 Promise 时,若该 Promise 被拒绝(reject),JavaScript 会将其转化为一个同步抛出的异常,try...catch 就能捕获它。
await
catch 块接收到的是 reject 的 reason(通常是 Error 实例或任意值)async function fetchData() { try { const res = await fetch('/api/data'); // 如果网络失败或 4xx/5xx,fetch 不 reject,但 .json() 可能 fail if (!res.ok) throw new Error(`HTTP ${res.status}`); const data = await res.json(); // 这里可能因 JSON 解析失败而 reject return data; } catch (err) { console.error('请求或解析失败:', err.message); throw err; // 可选择重新抛出,让调用方处理 }}
如果写了 fetch('/api/data') 却没加 await,这个 Promise 就变成“未处理的拒绝”(unhandled rejection),try...catch 完全无效,控制台会报 warning,且可能触发全局 unhandledrejection 事件。
fetch('/api/data').then(...) 在 try 内部 —— then 的错误需在内部用 .catch() 处理await 和 .then() 容易遗漏错误分支fetch 只在网络故障或请求被阻止时 reject;404、500 等响应仍返回 resolve 的 Response 对象。必须手动检查 res.ok 或 res.status 并主动 throw 才能进入 catch。
立即学习“Java免费学习笔记(深入)”;
多个异步操作并行时(如 Promise.all),任一 Promise 拒绝会导致整个 Promise.all 拒绝。如需各自独立处理,可用 Promise.allSettled 或包装每个 Promise:
await Promise.all([p1, p2]):一个失败,全部失败await Promise.allSettled([p1, p2]):返回每个结果的状态(fulfilled/rejected),不会抛异常async () => { try { ... } catch(e) { return { error: e } } }