JS异步错误处理需将捕获点置于Promise链末端或async函数内部:.catch()捕获链中所有错误并冒泡,finally用于清理;async/await中try/catch仅对await的Promise生效;须全局监听unhandledrejection兜底。

JS 异步错误处理不能靠 try...catch 包裹异步代码本身,关键在于把错误捕获点放在异步流程的“出口”位置——也就是 Promise 链末端或 async 函数内部。
Promise 链中的错误捕获位置
Promise 的 .then() 只处理兑现(resolved)状态;.catch() 是专门用于捕获链中任意环节抛出的错误(包括 reject() 和同步异常),它会向后冒泡直到被第一个 .catch() 拦截。
-
.catch()必须写在链的末尾,或至少覆盖所有可能出错的.then()后面 - 多个
.then()中任意一个抛出错误(如throw new Error()),都会跳过后续.then(),直接进入最近的.catch() -
.finally()不影响错误流向,适合放清理逻辑(如关闭 loading)
async/await 中的 try/catch 写法
async 函数内部可以使用同步风格的 try...catch,但仅对 await 表达式生效——即只捕获被 await 的 Promise 被 reject 时的错误,或 await 后面的表达式本身报错。
- 必须用
await等待 Promise,否则try/catch无法捕获其 rejection - 未 await 的 Promise 错误会变成未处理拒绝(unhandled rejection),触发
unhandledrejection事件 - 推荐结构:
try { const data = await fetch(...); } catch (err) { /* 处理网络失败、解析失败等 */ }
全局兜底与开发调试支持
即使链上写了 .catch() 或 try/catch,仍可能漏掉某些场景,需要全局监听作为最后防线。
- 浏览器中监听
window.addEventListener('unhandledrejection', e => {...}) - Node.js 中监听
process.on('unhandledRejection', (reason, promise) => {...}) - 配合
console.error或上报服务,避免静默失败
常见误区与避坑点
很多错误不是没写 catch,而是写错了位置或理解偏差。
- ❌
fetch(url).then(...)没有.catch():网络失败、404、500 都不会进.then(),但也不会自动报错,容易被忽略 - ❌
fetch(url).then(res => res.json()).catch(...):只能捕获res.json()报错(如非法 JSON),捕获不到 HTTP 状态码错误 - ✅ 正确做法:先检查
res.ok,再await res.json(),并在外层try/catch统一处理


















