在 async/await 模式下调试异步异常,关键在于让异常不被吞掉、能准确定位到抛出位置、并在调试器中停住;需用 try/catch 或 .catch() 捕获 rejection,启用异步断点与 async stack traces,并监听 unhandledrejection 以辅助定位。

在 async/await 模式下调试异步异常,关键在于让异常不被吞掉、能准确定位到抛出位置、并在调试器中停住。JavaScript 的异步错误默认不会中断执行,容易“静默失败”,所以得主动干预。
确保异常能冒泡到可捕获的位置
async 函数内部抛出的异常,会变成该函数返回 Promise 的 rejection。如果没用 try/catch 或 .catch() 处理,错误会被丢弃(尤其在未启用 “unhandledrejection” 监听时)。
- 在顶层 async 函数里,用
try/catch包裹 await 表达式,这样调试器能在 throw 处暂停 - 避免只写
await someAsyncFn()而不处理可能的 reject —— 它不会自动抛出同步错误 - 若调用链较长(比如 A → B → C),确保每一层都正确传播 rejection,或至少在入口处兜底
利用浏览器/IDE 的异步断点和暂停功能
现代 Chrome DevTools 和 VS Code 都支持异步调试:
- Chrome:打开 DevTools → “Sources” → 右键代码区域 → 勾选 “Async” 断点;或在 await 行打普通断点,它会在 await 完成后自动停在下一行(注意不是在 Promise 创建时停)
- VS Code:在 await 行设断点,启动调试(F5),它会自然停在 await 解析后;若想在 reject 时中断,需开启 “Uncaught Exceptions” 或 “All Exceptions” 暂停选项(调试设置里勾选)
- 遇到未捕获 rejection 时,DevTools 控制台会显示黄色警告,点击可跳转到 Promise 构造位置 —— 但注意,这通常不是 throw 的真实位置,而是 Promise 创建处
主动监听未处理的 rejection
全局捕获有助于发现漏处理的错误:
- 在浏览器中加:
window.addEventListener('unhandledrejection', e => { console.error('Uncaught:', e.reason); debugger; }); - Node.js 中加:
process.on('unhandledRejection', (reason, promise) => { console.error('Unhandled:', reason); }); - 注意:仅用于开发期定位问题,生产环境建议记录日志而非 debugger
用工具辅助定位源头
Promise 的堆栈信息默认不包含 async/await 的完整调用链,可通过以下方式增强:
- Chrome 中开启 “Async stack traces”(Settings → Preferences → Sources → 勾选 “Enable async stack traces”)
- Node.js 启动时加
--trace-warnings参数,让未捕获 rejection 输出更详细的堆栈 - 在关键 await 前加
console.log('before fetch')或使用console.trace()辅助判断执行路径
不复杂但容易忽略:异常发生在 await 后的代码里(比如解构 response.data),它就是同步错误,调试器能直接停;而发生在 Promise 内部(如 fetch.then 里 throw),就属于异步 rejection,必须靠 catch 或 unhandledrejection 捕获。











