gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 22:26:39 24 4
gpt4 key购买 nike

采用这段代码,我们有一个调用将失败的函数的 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
Node 7.4.0

最佳答案

解决方案

正如@T.J.Crowder在评论中指出的:

This only happens when an exception is thrown causing a rejection before a handler is attached. E.g., this wouldn't cause it, because when the exception is converted to rejection, there's already a rejection handler attached:

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

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

If a promise is rejected before an error handler is attached, the debugger will break, even if only "uncaught exceptions" is checked. If it's rejected after the error handler is attached, it works as expected. And really the problem is the way the promise doesn't know whether its rejection will be handled or not.

您仍然可以使用 vscode 来开发基于 Promise 的系统,但是您需要关闭 vscode 中的所有错误处理,如下所示,确保两个选项都没有被勾选。 注意:由于这远非最佳解决方案,因此将来可能会发生变化和/或改进。

(我对 vscode issue 发表了评论,如果我学到任何有用的东西,我会更新这篇文章)

编辑1:
我发现另一个解决方法是在 vscode 中定义一个键绑定(bind)来运行命令 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 */
}
]

编辑2:
正如 @T.J.Crowder 在评论中指出的那样:

This only happens when an exception is thrown causing a rejection before a handler is attached. E.g., this wouldn't cause it, because when the exception is converted to rejection, there's already a rejection handler attached:

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
});

关于javascript - 为什么 VS Code 在处理来自 Promise 中的 Reject 的异常时会中断?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45280630/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com