如何捕获promise运行时Javascript错误?

时间:2014-03-11 13:46:19

标签: javascript promise

我目前正在实施基于PDF.js的PDF查看器,并且作为其中的一部分我学习了有关承诺的对象。

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

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

我没有能够找到一种在promise函数中显示运行时错误的漂亮方法,而不是像http://www.asyncdev.net/2013/07/promises-errors-and-express-js/中所述那样添加.done()(它不适用于PDF.js)或添加.catch(function(error){ console.error(error); })

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

有没有办法强制promise函数像正常一样记录运行时错误(没有为每个函数调用编写额外的代码)?

2 个答案:

答案 0 :(得分:7)

您遇到的问题是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(…)

如果没有done方法throws出现错误,您可以throw setTimeout {{1}}自行实施{{1}}。

  

有没有办法强制promise函数像正常一样记录运行时错误(没有为每个函数调用编写额外的代码)?

没有。那不是like this

答案 1 :(得分:1)

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

你可以做的一件事就是改变那个尝试... catch来记录错误,然后再调用promise的失败。

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承诺,这个技巧可能不起作用。