为什么 VS Code 在处理来自 Promise 中的 Reject 的异常时会中断?

2023-12-09

拿这段代码来说,我们有一个调用将失败的函数的 Promise,并且它应该将错误传递给 Promise 的 catch 方法。
从终端运行时它工作得很好。 然而,当通过 vscode 运行时,它会爆炸(1).

function failingFunc() {
    let undef = undefined;
    return undef.nope();
}
let promise = new Promise((resolve, reject) => {
   resolve(failingFunc()); // (1) Explodes when run from vscode
});
promise.then(v => {}).catch((e: Error) => {
    console.log(e.message); // (2) Prints when run from the terminal
});

为什么是这样?

vscode 关于页面:
版本1.14.2
提交 cb82feb
日期 2017-07-19T23:26:08.116Z
外壳1.6.6
渲染器56.0.2924.87
节点7.4.0


Solution

As @T.J.克劳德评论中指出:

This only当抛出异常导致在附加处理程序之前拒绝时,就会发生这种情况。例如,这不会导致它,因为当异常转换为拒绝时,已经附加了一个拒绝处理程序:

new Promise((resolve, reject) => setTimeout(() => { 
    try { 
        throw new Error(); 
    } catch (e) { 
        reject(e); 
    } 
}, 0)).catch(error => console.log("Error:", error));

事实证明,这是使用 vscode 调试 Nodejs 时的一个已知“bug”。 正如其解释的那样这个问题(在 vscode git 存储库)发生这种情况是因为 Nodejs 发送了一个带有undefined遇到异常时reject打回来。当 vscode 的调试器看到这个中断事件时,它会执行它应该对未知异常执行的操作,它会暂停执行,然后抛出异常。
更多内容在这个问题(在 vscode-node-debug2 存储库)@roblourens说:

如果在附加错误处理程序之前承诺被拒绝,即使仅检查“未捕获的异常”,调试器也会中断。如果在附加错误处理程序后它被拒绝,它将按预期工作。 实际上,问题在于承诺不知道其拒绝是否会被处理。

You can still use vscode for developing Promise based systems, however you will need to turn off all error handling in vscode, as seen below make sure neither of the options are ticked. NOTE: Since this is far from an optimal solution, it is likely to get changed and or improved in the future.

(我已经评论过vscode 问题如果我学到任何有用的东西,我会更新这篇文章)

Edit1:
我发现另一个解决方法是在 vscode 中定义一个键绑定来运行命令workbench.action.debug.run。这将运行当前选定的调试选项,而不附加调试器。这意味着您可以使调试器保持正常设置,同时在需要处理被拒绝的 Promise 时使用新的键盘命令运行代码。

/* keybindings.json */
[
    {
        "key": "ctrl+shift+b",
        "command": "workbench.action.debug.start"
        /* Attaches debugger */
    },
    {
        "key": "ctrl+b",
        "command": "workbench.action.debug.run"
        /* Runs without debugger */
    }
]

Edit2:
As @T.J.克劳德评论中指出:

This only当抛出异常导致在附加处理程序之前拒绝时,就会发生这种情况。例如,这不会导致它,因为当异常转换为拒绝时,已经附加了一个拒绝处理程序:

new Promise((resolve, reject) => setTimeout(() => { 
    try { 
        throw new Error(); 
    } catch (e) { 
        reject(e); 
    } 
}, 0)).catch(error => console.log("Error:", error));

当然他是对的。下面的代码可以在附加调试器的 vscode 中运行。

function failingFunc() {
    let undef = undefined;
    return undef.nope();
}
let promise = new Promise((resolve, reject) => {
    setTimeout(() => {
        try {
            resolve(failingFunc())
        } catch (e) {
            reject(e);
        }
    }, 0);
});
promise.then(v => {}).catch((e: Error) => {
    console.log(e.message); // Cannot read property 'nope' of undefined
});
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 VS Code 在处理来自 Promise 中的 Reject 的异常时会中断? 的相关文章

  • React 渲染中的不变违规或 React 中迭代和返回的正确方法

    我在 React 渲染中遇到了持续存在的问题 这段代码 jsx React DOM var AnswerRows React createClass componentDidMount function render function th
  • 如何根据按钮单击折叠和展开 Kendo UI 树视图中的所有树节点?

    这是行不通的 您可以使用此代码 1 崩溃 折叠kendoTree查看文档 http docs kendoui com api web treeview methods collapse treeview kendoTreeView var
  • Google 饼图未显示所有数据行

    我正在尝试绘制人口与国家名称的关系图 我发现 Google 可视化库仅渲染前几个 实际上数字似乎是随机的 具体取决于我使用的数据 有时添加 其他 条目 但它没有t 实际上具有其余条目的值 Example 1 With all countri
  • npm install 不下载最新包

    语境 我在使用 npm install 命令使用最新的依赖项更新我的 package json 时遇到问题 我正在具有多分支管道的 Jenkins 从属设备上运行 不确定这是否是原因 另一个帖子有类似的问题 但没有得到答复 npm 安装后
  • 如何从表中选择所有偶数 id?

    我想从 MySQL 数据库的表中选择所有甚至帖子 ID 然后显示它们 我还想获取所有带有奇怪 id 的帖子并将它们显示在其他地方 我想使用 PHP 来完成此操作 因为这是我使用的服务器端语言 或者 我是否必须选择所有帖子 然后使用 Java
  • 零作为 IIFE 中的第一个参数[重复]

    这个问题在这里已经有答案了 In babeljs v6 5 1 class Foo 编译为 use strict var classCallCheck2 require babel runtime helpers classCallChec
  • 在 asp.net vb 中通过第一个下拉列表值填充第二个下拉列表

    我在使用 asp net vb 时遇到了一些问题 我想做的是有2个下拉框 第一个下拉菜单将有 1 2 3 例如 第二个下拉菜单将有 A 乙 C 默认情况下 但是 如果选择 1 我希望第二个下拉菜单自动选择 c 我不知道 JavaScript
  • 如何在 Node.js 中让一个 EventEmitter 监听另一个 EventEmitter?

    我想做这样的事情 var events require events var emitterA new events EventEmitter var emitterB new events EventEmitter emitterA ad
  • jQuery 的 css() 在应用于滚动事件时滞后

    我正在尝试实现一个简单的 固定标题 表 我知道这在理论上只能用 CSS 来完成 但是当涉及到 OSX Lion 及其消失的滚动条时 它效果不佳 所以我用 jQuery 来做 方法很简单 只有1 5行代码 inbox scroll funct
  • 如何在 AngularJS 中获得更多堆栈跟踪

    我正在使用装饰器来更改 exceptionHandler行为 将日志发送到服务器 我的问题是异常的堆栈跟踪似乎毫无用处 仅显示堆栈的一部分 例如 语法错误 标记 未定义 不是列 NaN 处的主表达式 表达式 此处的表达式 at Error
  • 在 JavaScript 中比较表单中的两个数字

    当我尝试比较不同的数字时 数字发生变化 但文本部分保持不变 这只发生在较大 较小的情况下 而不会发生在 NaN 或相等的情况下 这是我的代码 function check var a document getElementById a va
  • jQuery Blur() 在 Chrome 上不起作用

    我在 MacOSX 上运行这个http jsfiddle net q84wv http jsfiddle net q84wv on Chrome最新版本 它不会工作 在 Firefox 上运行时它工作得很好 有什么线索吗 假设您想要aler
  • 引入 V8 后,Google Apps 脚本无法为其他用户完全执行

    我编写了一个脚本 得到了这里好心人的大力帮助 该脚本使用 Google Sheets 脚本复制 Google Drive 上的文件夹 和内容 它运行了很长一段时间 但后来我启用了 V8 引擎 现在已禁用 问题是 它仍然适用于我 也许还有其他
  • 光滑的轮播缓动示例

    我正在使用 Slick Carousel http kenwheeler github io slick http kenwheeler github io slick 但不知道如何合并不同的幻灯片切换 有人有例子可以分享吗 这是我目前拥有
  • 使用 JavaScript 的计时器

    我想使用java脚本实现计时器 我想随着间隔的变化而减少计时器 Example假设我的计时器从 500 开始 我想要根据级别减少计时器 例如1 一级定时器应减1 且递减速度应较慢 2 2级定时器应递减2 递减速度应为中等3 3级定时器应减3
  • Javascript 选择 onchange='this.form.submit()'

    我有一个带有选择和一些文本输入的表单 我希望在更改选择时提交表单 使用以下方法可以正常工作 onchange this form submit 但是 如果表单还包含提交按钮 则当选择更改时 表单不会提交 我猜有某种冲突 我在这里有什么选择
  • 常规 JavaScript 可以与 jQuery 混合使用吗?

    例如 我可以采用这个脚本 来自 Mozilla 教程 https developer mozilla org en Canvas tutorial Basic usage
  • 如何在 JavaScript 中获取浮点数的小数位?

    我想要的是与 Number prototype toPrecision 几乎相反的 这意味着当我有数字时 它有多少位小数 例如 12 3456 getDecimals 4 对于任何想知道如何更快地完成此操作 无需转换为字符串 的人 这里有一
  • 为什么 Perl 6 的 try 不处理 shell() 中的非零退出?

    This try https docs raku org language exceptions index entry try blocks try捕获异常 try die X AdHoc say Got to the end 输出显示程
  • 使用 jquery 提供附加功能时菜单未正确对齐

    I need to make a mega menu similar to one as show in image below 到目前为止 我已经能够在某种程度上使其发挥作用 例如jsFiddle 在这里 http jsfiddle ne

随机推荐

  • 时间:2019-03-17 标签:c#updatepanelwithtimerpage_load

    我现在正在尝试一些 AJAX 我有一个自定义控件出现在我的母版页上 其中有一个更新面板和一个计时器 计时器启动 面板更新 一切都很顺利 除了我不希望它在每次刷新时执行一些操作之外 似乎每次刷新都会发生整个页面生命周期 我想设置一些变量 并在
  • 指数维护

    什么是索引维护以及如何进行 我需要多久做一次 有什么好处 这与经常修改的事务表有关 所有 DML 操作都将在该表上运行 我赞同乔纳森所说的一切 除了索引维护的频率 好吧 如果您碰巧有一个设计不佳的索引 例如 GUID 键上的聚集索引 您实际
  • 将 CURDATE() 的日期值与完整时间戳字段进行比较

    我有一个函数将时间戳值 YYYY MM DD HH MM SS 放入META VALUE表的列META 我想要做的是比较日期部分 YYYY MM DD 是否META VALUE等于今天 CURDATE 忽略小时 分钟和秒 HH MM SS
  • 尝试访问 Rails 控制台时 git 远程中的多个应用程序

    我有两个 git 分支 staging and production 我将它们部署在 Heroku 上的同一个 Heroku 帐户中 假设我的应用程序名称是app1 heroku app com and app2 heroku app co
  • 如何使用 ggplot2 在 R 中添加可变大小的 y 轴标签而不更改绘图宽度?

    我有一个用 R 中的 ggplot2 制作的图 我想在 y 轴上添加水平文本标签 然而 根据文本的长度 R 会相应地压缩我的绘图以创建固定宽度的图像 但是 无论文本宽度如何 我都需要绘图具有相同的长度并且具有相同的起始位置和停止位置 边距
  • Selenium:会话外部密钥不可用

    每当 Robot Framework 自动化测试 由 Jenkins 作业启动 从 Hub 请求 Chrome 浏览器时 我正在运行的 Selenium Grid Hub 就会显示此错误消息 会话 null externalkey 不可用且
  • Selenium:是否有类似“DOM 中插入新元素”之类的事件

    我正在测试的网站有一个通知逻辑 它会在屏幕底部显示一条消息 将其保留一秒钟 然后将其发送出去 当显示通知时 它会隐藏其他元素 这使我的测试不稳定 我尽力弄清楚通知何时显示 当业务逻辑显示通知时 并忽略它 但时不时地我会检测到我的代码不知道通
  • 如何将项目添加到列表

    我的项目中有模型 这是模型代码 public partial class Logging public string Imei get set public DateTime CurDateTime get set public Nulla
  • 在 Outlook 中自动调整 VML 背景图像的大小

    我知道关于防弹电子邮件背景hack 但由于这会在背景中放置一个设定大小的 VML 矩形 然后将内容放置在其中 因此它不会调整大小 或者换句话说 表格单元格中的文本被裁剪为 VML 矩形的高度 我已经尝试了我能想到的一切 但似乎无论如何都不允
  • 创建新实体时不会自动生成相对路由

    当我使用命令 jhipster实体 entityName 创建新实体时 相对路径不会在我的 entityName route ts中自动生成 相反 在主路线的地方我有这个 而不是 实体名称 另外 所有添加 更新 删除的路由也不包含前缀 en
  • AChartEngine不显示最大图表值

    我正在尝试使用 AChartEngine 显示水平条形图 在条形图中 应显示 ChartValues 我在代码中使用 XYSeriesRenderer setDisplayChartValues true 以下是渲染的图表 正如您所看到的
  • 使用 QTcpSocket 的 TCP 数据包

    我知道 TCP 保证所有数据包都会到达 但是一个数据包可以分成2个或更多吗 我正在使用 Qt 和 QTcpSocket 类 我想知道的是ReadyRead 仅当完整数据包到达时才会发出信号 或者换句话说 以第一个字节发送数据包大小 然后循环
  • 来自资源包的值作为 formatDate 中的模式

    我也想从资源包中读取 JST formatDate 的模式 但这种天真的方法不起作用 我做错了什么 在 com company MyPortlet properties 中是这个键 company date format yyyy MM d
  • 在 UICollectionView 或 UITableView 中实现粘性单元格

    我要实现一个包含项目列表的表格 其中包括一个应始终显示在屏幕上的项目 因此 例如 您的列表中有 50 项 您的 粘性 列表项是第 25 个 您可能会同时在屏幕上显示 10 个项目 无论您在列表中的位置如何 粘性 列表应始终保持可见 如果您的
  • 为什么使用 cudaMallocManaged 时 NVIDIA Pascal GPU 运行 CUDA 内核的速度很慢

    我正在测试新的 CUDA 8 以及 Pascal Titan X GPU 并期望我的代码能够加速 但由于某种原因 它最终变得更慢 我使用的是 Ubuntu 16 04 这是可以重现结果的最少代码 CUDASample cuh class C
  • android XML视图在Eclipse中不显示ToggleButton

    在我的 android XML 图形布局中 我无法显示我的ToggleButton 我收到一些错误 见下文 另外 我无法使用图形布局编辑其他任何内容
  • Cucumber Java - 如何在下一步中使用返回的字符串?

    我需要自动化一些网络服务 我为此创建了一些方法 并且我想使用 Cucumber 来实现这一点 但我不知道如何在下一步中使用返回值 所以 我有这个功能 Feature Create Client and place order Scenari
  • 尽管链接到带有导​​出符号的 .lib 文件,但从托管 C++ 链接到非托管 C++ 时出现链接错误

    尽管关注了有关从 C CLI 包装器 dll 使用和链接到非托管 C 代码的各种帖子 但我无法解决这些链接问题 1 gt MyClassAdapter obj error LNK2028 unresolved token 0A00000A
  • Corda 中的法律散文

    有人能解释一下 Corda 中的法律散文是什么吗 我明白这是一个文档 用于解决冲突 但我没有找到任何信息它是什么样的 又是如何与智能合约联系起来的呢 A Contract类可以注释为 LegalProseReference注解 该注释将合同
  • 为什么 VS Code 在处理来自 Promise 中的 Reject 的异常时会中断?

    拿这段代码来说 我们有一个调用将失败的函数的 Promise 并且它应该将错误传递给 Promise 的 catch 方法 从终端运行时它工作得很好 然而 当通过 vscode 运行时 它会爆炸 1 function failingFunc