如何捕获承诺运行时Javascript错误

How to catch promise runtime Javascript errors?

本文关键字:Javascript 错误 运行时 承诺 何捕获      更新时间:2023-09-26

我目前正在实现一个基于PDF.js的PDF查看器,作为其中的一部分,我了解了promise对象。

我还了解到运行时错误不会自动显示在调试控制台中:

PDFJS.getDocument(...).then(
  function(pdfDocument){
    alert(UndefinedVariable); // Not shown in console!
  },
  function(error){
    console.log("Error occurred", error);
  }
);

我还没能找到一个漂亮的方式来显示运行时错误的承诺函数,除了添加.done()如http://www.asyncdev.net/2013/07/promises-errors-and-express-js/所述(这并不适用于PDF.js)或添加.catch(function(error){ console.error(error); })

我知道我可以在调试器中中断运行时错误的异常,但我也会在其他异常(在jQuery中)上中断这样做,这意味着我必须在每个页面加载上执行5个jQuery异常,然后才能检查我自己的代码是否包含运行时错误。

是否有任何方法可以强制承诺函数像正常一样记录运行时错误(而无需为每个函数调用编写额外的代码)?

您遇到的问题是then回调中的异常拒绝.then()返回的承诺,而不是调用您传入的错误处理程序。这只会触发上的承诺中的错误,您称之为.then()。所以你可以链接你的处理程序:

PDFJS.getDocument(...).then(function(pdfDocument){
    alert(UndefinedVariable); // Now shown in console!
}).then(null, function(error){
    console.log("Error occurred", error);
});

这里,then(null, …)也可以缩写为catch(…)

如果没有throws处理错误的done方法,您可以通过在setTimeout中使用throw来实现它。

是否有任何方法可以强制承诺函数像正常一样记录运行时错误(而无需为每个函数调用编写额外的代码)?

在Promise实现中,有一个尝试…catch从回调中获取错误,并将其转换为Promise返回的错误。

你可以做的一件事就是改变尝试…Catch在调用承诺失败之前记录错误。

https://github.com/mozilla/pdf.js/blob/master/src/shared/util.js L936

    } catch (ex) {
      console.error(ex); // <--- add this line
      nextStatus = STATUS_REJECTED;
      nextValue = ex;
    }
如果使用原生ECMAScript 6承诺,这个技巧可能就不起作用了。