VSCode调试异常不中断,主因是launch.json中type不匹配、异常断点未开启或运行方式非F5启动;需确认type正确、通过F5启动、并在调试视图勾选“未处理的异常”。

VSCode调试时异常不中断,不是配置漏了,就是调试器没监听到——根本原因往往出在 launch.json 类型声明、异常策略开关、或运行时环境不匹配上。
为什么“抛错不暂停”?先查这三处硬性条件
异常断点生效有前提,缺一不可:
-
launch.json中"type"必须匹配实际运行环境:Node.js 项目用"type": "pwa-node"或"type": "node",不是"pwa-chrome";Python 项目必须是"type": "python",且已安装debugpy - 调试会话必须通过 VS Code 启动(F5 或 “运行和调试”面板),不能直接用终端
node app.js运行——后者调试器压根没挂载 - 语法错误(
SyntaxError)永远不会触发异常断点,它发生在 JS 引擎解析阶段,调试器还没加载。这类错误只会在终端报错,需靠 ESLint 或保存时校验提前拦截
如何精准控制“在哪类异常上停”
VS Code 不是简单地“遇到 throw 就停”,而是分层控制,关键看你在哪设的开关:
- 在调试视图(Ctrl+Shift+D)底部“异常断点”区域勾选:
所有异常→ 每次throw都中断;未处理的异常→ 只在没被try/catch或.catch()捕获时中断(推荐日常开启) - 在
launch.json里配"exceptions":Node.js 项目支持"uncaught": true和"caught": false;Python 项目则靠"exceptionHandling"字段,"breakMode": "always"才会连已捕获异常也中断 - 想只盯某类错误?比如网络失败,就点击“异常断点”旁的
+,输入TypeError或自定义错误名(如ApiTimeoutError),避免被无关异常干扰
异步异常(Promise reject、async throw)为什么总抓不到?
异步错误容易“消失”,是因为它们默认被 Promise 机制吞掉,调试器需额外监听:
- “未处理的异常”勾选项默认包含未捕获的 Promise 拒绝(
unhandledrejection),但前提是你的 Node.js 版本 ≥ 15,且没在代码里全局监听process.on('unhandledRejection', ...)——一旦监听了,错误就被“处理”了,调试器不再介入 - async 函数内
throw new Error(),若外层没await或没包try,它等价于一个 rejected Promise,会被“未处理的异常”捕获;但如果写了await fn();却没catch,同样触发 - 注意:Chrome DevTools 的
unhandledrejection监听逻辑和 Node.js 不同,前端调试建议用"type": "pwa-chrome"并确认启用unhandledrejection事件监听
变量面板里看不到异常详情?别只盯着“Variables”栏
异常对象(尤其是带 InnerException 或嵌套 cause 的)不会完整展现在 Variables 面板,默认只显示顶层字段:
- 暂停后,立刻打开“调试控制台”,输
error或err(取决于你 catch 时的参数名),再输error.stack看完整堆栈,error.cause查嵌套原因 - 如果异常来自 .NET 或 Java,Variables 面板可能不显示
InnerException,得切到“调试”侧边栏的“异常帮助程序”窗口(VS Code 里叫 “Exception Helper”)——它专门展开多层异常结构 - Promise 异常常卡在
Pending状态:在控制台输await myPromise(仅限当前 async 暂停帧),才能看到最终 reject 的 error 对象
最易被忽略的是:异常断点依赖调试器与运行时的双向通信协议。换言之,你改了 launch.json,但没重启调试会话,或者用了旧版 node(


















