try-catch 必须配合 await 才能捕获 async 函数中 Promise 的 reject;漏掉 await 会导致 unhandledrejection;推荐用 await + try-catch 处理单个异步操作,用 Promise.allSettled() 安全处理多个并行请求,并辅以全局 unhandledrejection 监听兜底。

在 JavaScript 中,try-catch 不能直接捕获 async 函数内部未被 await 的 Promise 拒绝(reject)——必须配合 await 才能让异常落入 catch 块。否则,未处理的 Promise rejection 会触发全局 unhandledrejection 事件,甚至导致静默失败。
✅ 正确写法:在 async 函数内用 await + try-catch
只有对返回 Promise 的异步操作(如 fetch、axios.get、自定义 Promise)使用 await,才能让拒绝状态转为可捕获的异常:
- 把异步调用写在
try块中,并用await等待其完成 - 一旦 Promise 被 reject,
await会抛出错误,进入catch分支 - 推荐始终
await异步调用,避免“忘记处理”的陷阱
async function loadUserData() {
try {
const res = await fetch('/api/user');
if (!res.ok) throw new Error(`HTTP ${res.status}`);
const data = await res.json();
return data;
} catch (err) {
console.error('加载用户失败:', err.message);
// 可返回默认值、重试、或 re-throw
throw err;
}
}
⚠️ 常见错误:漏掉 await 或在外部调用时不处理
以下写法无法被当前 try-catch 捕获:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
fetch('/api/user').then(...)—— Promise 链式调用未 await,错误只走.catch() -
loadUserData();(没 await)—— 调用方未等待,异常抛给外层作用域或变成 unhandled rejection - 多个并行请求只
await其中一个,其余可能静默失败
? 处理多个并行异步请求的异常
用 Promise.allSettled() 更安全,它不会因某一项失败而中断,且能区分成功/失败项:
立即学习“Java免费学习笔记(深入)”;
- 替代
Promise.all()(一错全错),适合“尽力加载多个资源”场景 - 结果数组每项含
status: 'fulfilled' | 'rejected'和对应value或reason - 仍可在
try-catch中包裹allSettled,但主要靠遍历结果做逻辑判断
async function loadMultiple() {
try {
const results = await Promise.allSettled([
fetch('/api/posts'),
fetch('/api/comments'),
fetch('/api/profile')
]);
const [postsRes, commentsRes, profileRes] = results;
if (postsRes.status === 'rejected') {
console.warn('文章加载失败:', postsRes.reason);
} else {
const posts = await postsRes.value.json();
// 处理 posts
}
// 其他类似...
} catch (err) {
console.error('意外错误:', err);
}
}
? 补充:全局兜底(不替代局部 try-catch)
监听 unhandledrejection 可捕获漏网之鱼,用于日志上报或友好提示,但不能代替业务层的主动错误处理:
- 它无法知道错误发生在哪一行、哪个请求、上下文是什么
- 仅适合监控和降级提醒,比如弹出“部分数据加载异常,请稍后重试”
- 需配合
event.preventDefault()阻止控制台报错(可选)
window.addEventListener('unhandledrejection', event => {
console.warn('未捕获的 Promise 错误:', event.reason);
// 上报 Sentry / 埋点 / 显示 toast
event.preventDefault();
});

















