【问题标题】:Chrome Dev Tools pausing on rejected promise even though I'm catching itChrome 开发工具在被拒绝的承诺上暂停,即使我正在接受它
【发布时间】:2020-06-04 21:50:44
【问题描述】:

我有以下打字稿代码,其中我从承诺创建函数中抛出了一个同步错误:

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

令我惊讶的是,这会在 Chrome 开发工具的 throw 行中触发“承诺拒绝时暂停”。我打开了“暂停异常”,并关闭了“暂停捕获异常”,因为我想了解未捕获的异常。

为什么会暂停?我以两种方式捕捉异常:使用.catchtry/catch 围绕整个事物。当我继续时,.catch 节按预期捕获它。

我在 Windows 10 上使用 Chrome 80.0.3987.116 和 typescript 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);
  }
}

【问题讨论】:

    标签: javascript typescript google-chrome-devtools es6-promise


    【解决方案1】:

    这个issue 是在 2015 年作为铬的错误报告提出的。以下是我在讨论中可以看到的一些相关陈述:

    构造函数回调是在“.catch()”代码执行之前同步调用的,所以在抛出异常的时候确实没有被捕获。后来它被抓住了......(aandrey@chromium.org)

    Try-catch 范围是静态的。在投掷的时候,我们知道它会被抓住。 (yangguo@chromium.org)

    此时,promise 实现检查并调用拒绝处理程序可能要晚很多。不过,DevTools 语义需要在 throw 站点中断,才能理解“异常中断”。 (yangguo@chromium.org)

    所以我想我们正在讨论的场景是 Promise 在构造函数中被拒绝的情况......在这种情况下,还没有机会附加拒绝处理程序。 (yangguo@chromium.org)

    长话短说,当您在 Promise 构造函数中抛出错误时,devtools 很难确定它稍后会被处理。

    相反,在你的构造函数中处理它:

    function testExc(url) {
      return new Promise((resolve, reject) => {
        try {
          throw new Error('hi');
        }
        catch (e) {
          console.log(`Caught ${e}`);
          resolve();
        }
      })
    }
    

    【讨论】:

      猜你喜欢
      • 2021-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-11
      • 1970-01-01
      • 2021-03-16
      • 1970-01-01
      • 2018-05-09
      相关资源
      最近更新 更多