async/await 错误需显式处理,未捕获的 Promise 拒绝会触发 unhandledrejection 事件,应监听该事件实现全局捕获;浏览器用 window.addEventListener('unhandledrejection'),Node.js 用 process.on('unhandledRejection');同时结合 window.onerror 捕获同步错误,分层处理(业务层 try/catch、中间件封装、全局兜底)更可靠。

async/await 本身不会自动抛到全局异常处理器(如 window.onerror 或 process.on('unhandledRejection')),必须显式处理或确保 Promise 链不“丢失”错误。关键在于:未被 catch 的 Promise 拒绝会触发 unhandledrejection 事件,这是全局捕获 async 错误的主入口。
监听 unhandledrejection 事件(浏览器 & Node.js)
这是捕获未处理 async 错误最通用的方式。所有未被 await 后 try/catch 捕获、也未被 .catch() 处理的 Promise 拒绝都会触发它。
- 浏览器中监听:
window.addEventListener('unhandledrejection', e => { console.error('全局 async 错误:', e.reason); }); - Node.js 中监听:
process.on('unhandledRejection', (reason, promise) => { console.error('未处理的 Promise 拒绝:', reason); }); - 注意:该事件只捕获真正“未处理”的拒绝;一旦 Promise 被
await或.catch()接住,就不会触发此事件
避免在顶层 async 函数中漏掉 try/catch
直接在模块顶层(或 IIFE 中)使用 async 函数时,若不包裹 try/catch,其内部错误将变成未处理 Promise 拒绝。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- ❌ 错误写法:
async function init() { throw new Error('初始化失败'); } init(); // 没 catch → 触发 unhandledrejection - ✅ 正确写法:
async function init() { throw new Error('初始化失败'); } init().catch(console.error); // 主动处理 - 或用 IIFE 包裹:
(async () => { try { await someAsyncOp(); } catch (e) { handleError(e); } })();
结合 window.onerror(仅限同步 + Promise rejection 堆栈)
window.onerror 默认不捕获 Promise 错误,但它能捕获 async 函数中同步抛出的错误(比如 throw 在 await 前),而 unhandledrejection 补足异步拒绝部分。
立即学习“Java免费学习笔记(深入)”;
- 两者配合可覆盖更全场景:
window.onerror抓同步异常,unhandledrejection抓未处理的 Promise 拒绝 - 注意:
window.onerror的error参数在 Promise 错误中通常为null,所以不能依赖它获取 reject 原因,必须靠unhandledrejection的e.reason
框架/应用层统一错误处理建议
在实际项目中,推荐分层处理而非只靠全局监听:
- 业务逻辑层:每个顶层 async 操作(如页面加载、表单提交)都配
try/catch,做用户友好的反馈 - 中间件层(如 React、Vue 或 Express):封装统一的 async handler,自动捕获并上报
- 全局兜底:保留
unhandledrejection监听,用于发现遗漏的异常路径和监控告警 - 开发阶段开启
console.error并保留堆栈,生产环境建议上报至错误平台(如 Sentry)

















