我有以下打字稿代码,在其中我从promise创建函数中引发了同步错误:
function testExc(url: string): Promise<GLTF | undefined> {
try {
const promise: Promise<GLTF> = new Promise((resolve, reject) => {
throw Error('hi')
})
promise.catch((err) => { console.log(`Caught ${err}`) })
return promise
} catch (e) {
return Promise.resolve()
}
}
令我惊讶的是,它在
throw
行的Chrome开发工具中触发了“暂停承诺付款”。因为我想了解未捕获的异常,所以我已启用“异常暂停”和“暂停捕获的异常”。为什么暂停?我有两种捕获异常的方法:围绕整个内容使用
.catch
和try/catch
。当我继续时,.catch
节按预期捕获了它。我正在Windows 10上使用Chrome 80.0.3987.116,打字稿3.7。
如果有帮助,已转译的JS代码如下所示:
function testExc(url) {
try {
const promise = new Promise((resolve, reject) => {
throw Error('hi');
resolve(undefined);
});
promise.catch(err => {console.log(`Caught ${err}`);});
return promise;
}
catch (e) {
return Promise.resolve(undefined);
}
}
最佳答案
此issue于2015年提出,是关于铬的错误报告。这是我在讨论中可以看到的一些相关声明:
在执行“ .catch()”代码之前,将同步调用构造函数回调,因此,在引发异常时,它确实未被捕获。后来它被捕获了...([email protected])
尝试捕获范围是静态的。在抛出时,我们知道它将被捕获。 ([email protected])
此时,promise实现将检查并调用拒绝处理程序可能要晚得多。但是,DevTools语义需要在抛出站点处中断,以使其具有“异常中断”的意义。 ([email protected])
因此,我想我们正在讨论的场景是在构造函数中拒绝Promise的情况。在这种情况下,还没有机会附加拒绝处理程序。 ([email protected])
简而言之,当您在promise构造函数中抛出错误时,devtools很难识别出它稍后会被处理。
而是在构造函数中处理它:
function testExc(url) {
return new Promise((resolve, reject) => {
try {
throw new Error('hi');
}
catch (e) {
console.log(`Caught ${e}`);
resolve();
}
})
}
关于javascript - Chrome开发者工具暂停了被拒绝的 promise ,即使我发现了它,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/60322164/