javascript异步错误捕获需系统性规避:一、async/await调用必须await并兜底.catch();二、promise链末尾必须.catch();三、全局监听error和unhandledrejection;四、catch须上报、重试、降级或提示,禁静默吞错。

JavaScript 中异步错误捕获遗漏,是线上白屏、接口静默失败、监控告警缺失的常见根源。关键不在于“能不能捕获”,而在于“错误是否真正被处理并可控”。下面从四个实际落地环节讲清楚怎么系统性规避。
一、async/await 必须配 await 调用,否则 try-catch 形同虚设
async 函数内部的 try-catch 只对 该函数内 await 的 Promise 拒绝生效。如果调用方没 await,Promise 就“悬空”了,即使内部 catch 执行了,后续链式操作或未监听的 reject 仍会触发 UnhandledRejection。
- ❌ 错误写法:调用后不 await,也不 .catch()
loadConfig(); // 内部有 try-catch,但这里没处理返回的 Promise
- ✅ 正确做法:在调用链最末端兜底
loadConfig().catch(err => {
console.error('顶层配置加载异常', err);
reportError(err); // 上报监控
});
二、Promise 链必须以 .catch() 结尾,不能依赖中间层拦截
Promise 链中任意一环 reject,若后续没有 .catch(),就会一路冒泡到全局。尤其注意 .then() 后跟另一个 .then() 时,第二个 .then() 不会捕获第一个的错误。
- ❌ 常见疏漏:只在第一个 .then() 里处理成功,忘了加 .catch()
fetch('/api/user').then(res => res.json()).then(data => render(data));
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- ✅ 推荐模式:统一在链末尾捕获,或用 async/await 替代
fetch('/api/user')
.then(res => { if (!res.ok) throw new Error(res.status); return res.json(); })
.then(data => render(data))
.catch(err => handleApiError(err));
三、全局兜底不可省,但要区分 error 和 unhandledrejection
它们捕获的是两类完全不同的错误,缺一不可:
- window.addEventListener('error'):捕获同步脚本错误、资源加载失败(如 JS 文件 404)、iframe 报错等
- window.addEventListener('unhandledrejection'):专捕未被 .catch() 或 try-catch 处理的 Promise.reject()
两者都应做最小必要上报,包含:错误信息、堆栈、当前 URL、时间戳、用户行为上下文(如按钮 ID)。注意调用 event.preventDefault() 避免重复打印干扰日志。
四、避免“静默吞错”,所有 catch 都要有明确归宿
catch 里只写 console.error(e) 或什么都不做,等于把问题藏起来。生产环境必须做到:
- 至少记录错误到控制台 + 上报服务(如 Sentry、自建日志平台)
- 根据错误类型决定是否重试(如网络超时)、降级(返回缓存数据)、提示用户(“稍后再试”)或跳转登录页(AuthError)
- 禁止
throw e后不再处理——除非你明确知道上层会接住
例如解析 JSON 失败,不能只 console,而应:提示用户输入格式错误 + 清空输入框 + 聚焦回输入框。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










