js异步错误处理的关键在于区分同步执行流和异步任务调度机制,错误能否被捕获取决于是否发生在当前执行上下文内;需紧扣“执行时机”和“错误传播路径”两个维度。

直接点明核心:JS异步错误处理的关键在于区分同步执行流和异步任务调度机制,错误能否被捕获,取决于它是否发生在当前执行上下文内。面试时抓住“执行时机”和“错误传播路径”两个维度,就能稳住逻辑、答准要点。
一、先讲清 try-catch 的能力边界
try-catch 只捕获同步代码或 await 后立即抛出的错误,它对纯异步回调(如 setTimeout、Promise.then 回调)无效——因为这些回调在事件循环后续阶段执行,此时 try 块早已退出。
- ❌ 错误示范:
try { setTimeout(() => { throw new Error() }); } catch(e) { }→ 不会进入 catch - ✅ 正确思路:错误必须在同一个执行上下文中被抛出,才可能被外层 try-catch 捕获
- ? 面试加分点:类比“快递员把包裹放柜子后离开,你关上门就走了——不是你不收,是人不在现场”
二、Promise 错误必须走 Promise 链路
Promise 内部抛错不会冒泡到外层 try,而是让该 Promise 进入 rejected 状态。必须用 .catch() 或 await + try-catch 接住。
DMap GL地图JSAPI(dmapgl)开发指南。用于编写、审查、调试 DMap 地图 API 代码,涵盖地图初始化、覆盖物渲染、图层管理、事件处理、控件交互等任务。当用户提及 dmap、dmapgl、jsapi‑gl 或相关地图开发需求时自动触发。
- ❌
try { Promise.resolve().then(() => { throw 'err' }); }→ 错误丢失,触发 UnhandledRejection - ✅
Promise.resolve().then(() => { throw 'err' }).catch(console.error) - ✅
async () => { try { await Promise.resolve().then(() => { throw 'err' }); } catch(e) { console.error(e); } }
三、async/await 是最推荐的统一方案
async 函数返回 Promise,await 会把 Promise 的 reject 转为同步可捕获的异常,因此 一个 try-catch 就能覆盖多个 await 表达式,写法清晰、错误位置明确。
- 优势:避免 .then/.catch 链式分散;支持同步+异步错误统一处理;便于添加日志、降级逻辑
- 注意点:await 后必须是 Promise,否则不生效;不要在循环中无脑 await,可能影响性能
- 小技巧:多个并行请求可用
await Promise.all([p1, p2].map(p => p.catch(e => e)))防止一个失败中断全部
四、补充常考细节:微任务 vs 宏任务、全局兜底
面试官可能追问“那没被捕获的异步错误去哪了?”——要答出运行时兜底机制:
-
unhandledrejection事件监听未被 catch 的 Promise rejection -
error事件监听全局同步错误(但捕获不了异步错误) - 微任务(如 Promise.then)总比宏任务(如 setTimeout)先执行,所以 Promise 错误比 setTimeout 错误更早暴露
不复杂但容易忽略:真正决定错误能不能被你拿到的,从来不是语法形式,而是它在哪一轮事件循环里抛出、有没有被对应的任务链主动接收。










