我有以下打字稿代码,在其中我从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开发工具中触发了“暂停承诺付款”。因为我想了解未捕获的异常,所以我已启用“异常暂停”和“暂停捕获的异常”。

为什么暂停?我有两种捕获异常的方法:围绕整个内容使用.catchtry/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/

10-16 22:02