VSCode 调试 Node.js 时需手动启用“Node.js: Uncaught Promise Rejections”断点,仅勾选“Uncaught Exceptions”或配置 launch.json 中 exceptions 无效;必须在调试面板断点区域点击 + 号添加并确保勾选,且仅 F5 调试模式生效。

VSCode 调试 Node.js 时,Promise.reject() 或异步操作失败后没加 .catch(),进程直接崩溃且断点不触发——这不是代码写错了,而是调试器根本没监听这类异常,默认只抓同步抛错。
为什么 Uncaught Promise Rejections 断点默认不生效
Node.js 调试器把「未捕获异常」和「未处理拒绝」当成两类独立事件。UI 里勾选了 Uncaught Exceptions,不代表它会停在 Promise.reject(new Error()) 上——那属于 unhandledRejection 事件,必须单独启用。
- VSCode 的 Node.js 调试器不读
launch.json里的exceptions字段,只认 UI 面板里手动开关的断点类型 - 即使你在代码里写了
process.on('unhandledRejection', ...),调试器也不会自动跳转到那里,除非你显式启用该断点 - 错误堆栈里出现
UnhandledPromiseRejectionWarning就是典型信号,但控制台可能只输出警告,不中断执行
如何让 VSCode 在 Promise 拒绝时真正中断
必须在「运行和调试」面板的「断点」区域手动添加,不能靠配置文件或全局设置。
- 打开
Ctrl+Shift+D→ 找到「断点」区域右下角的+号 → 选择Node.js: Uncaught Promise Rejections - 确认该断点已勾选(图标变实心),不是灰色空心状态
- 如果用的是 Remote-SSH 或 WSL,需确保远程环境也支持该断点机制(Node.js ≥ 12.0,VSCode 远程扩展 ≥ 1.118)
- 重启当前调试会话,旧的断点配置不会自动继承
常见干扰项:你以为开了,其实没开
很多人以为勾了 Uncaught Exceptions 就够了,或者改了 launch.json 就生效,结果还是跳过 Promise 错误。
-
launch.json里的"exceptions": { "uncaught": true }对 Promise 拒绝完全无效,删掉也无所谓 - 终端里跑
node app.js不会触发这个断点,只有 F5 启动调试模式才起作用 - 某些插件(如 Jest Runner)会覆盖调试配置,导致断点开关被重置,每次启动前最好手动检查一遍
- 如果 Promise 是在
setTimeout或setImmediate里 reject 的,断点仍会命中,但调用栈可能显示为<anonymous>,需结合console.trace()辅助定位
最易被忽略的是:这个断点开关和 Uncaught Exceptions 是两个物理独立的开关,少一个,Promise 崩溃就悄无声息。别信配置文件,盯住 UI 面板里的那个勾选框。


















