javascript捕获异步异常的核心是promise链末尾加.catch()或async/await用try/catch包裹await,未处理拒绝会触发unhandledrejection;并行操作推荐promise.allsettled汇总状态。

JavaScript 中捕获异步异常的核心原则是:**Promise 链中必须有 .catch() 或 try/catch,且不能遗漏中间环节;async/await 必须用 try/catch 包裹 await 表达式,否则未处理的拒绝会变成 unhandledrejection。**
Promise 链中的异常捕获
Promise 链一旦出现 reject,会跳过后续所有 .then(),直到遇到第一个 .catch();若整条链没有 .catch(),就会触发全局 unhandledrejection 事件。
- 推荐在链末尾加 .catch(),统一处理链上任意环节的错误:
.then(res => res.json())
.then(data => console.log(data))
.catch(err => console.error('请求或解析失败:', err));
- 如果想在中间步骤单独处理某类错误(比如只重试网络失败),可用 .catch() 后返回新 Promise,让链继续:
.catch(err => {
if (err.name === 'TypeError') {
return fetch('/api/fallback'); // 捕获后恢复链
}
throw err; // 其他错误继续冒泡
})
.then(res => res.json())
.catch(err => console.error('最终失败:', err));
async/await 中的异常捕获
await 会把 rejected Promise 转为 throw,因此必须用 try/catch 捕获;不包裹 await 就等同于漏掉 .catch()。
- 正确写法:每个可能出错的 await 都应在 try 块内,或至少整个逻辑块被 try/catch 包裹:
try {
const res = await fetch('/api/data');
if (!res.ok) throw new Error(`HTTP ${res.status}`);
const data = await res.json();
return data;
} catch (err) {
console.error('加载失败:', err);
throw err; // 可选择重新抛出供上层处理
}
}
- 避免常见错误:不要这样写(await 脱离 try/catch):
const res = await fetch('/api/data'); // 若这里失败,无 catch → unhandledrejection
return res.json(); // 这里也可能失败,同样没兜住
}
全局兜底:监听 unhandledrejection
用于捕获所有未被 .catch() 或 try/catch 处理的 Promise 拒绝,适合日志上报,但不能替代局部错误处理。
window.addEventListener('unhandledrejection', event => {console.warn('未捕获的 Promise 拒绝:', event.reason);
event.preventDefault(); // 阻止默认控制台警告(可选)
});
- 注意:Node.js 中对应的是 process.on('unhandledRejection', ...)
- 该监听仅作兜底,不是错误处理的主要手段
并行 Promise 的异常处理(Promise.all 等)
Promise.all 任一 Promise reject 就立即 reject 整个结果;如需全部执行完再汇总成败,用 Promise.allSettled。
- 用 Promise.all + try/catch:
const [user, posts] = await Promise.all([
fetch('/api/user').then(r => r.json()),
fetch('/api/posts').then(r => r.json())
]);
} catch (err) {
console.error('任一请求失败:', err);
}
- 用 Promise.allSettled 获取每个结果状态(fulfilled/rejected):
fetch('/api/user'),
fetch('/api/posts')
]);
results.forEach((result, i) => {
if (result.status === 'rejected') {
console.warn(`第 ${i + 1} 个请求失败:`, result.reason);
}
});
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











