【问题标题】:How to catch promise runtime Javascript errors?如何捕捉承诺运行时 Javascript 错误?
【发布时间】:2014-03-12 02:40:03
【问题描述】:

我目前正在实现一个基于 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)或添加@987654324 之外,我还没有找到一种在promise 函数中显示运行时错误的漂亮方法@。

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

有什么方法可以强制 promise 函数像平常一样记录运行时错误(无需为每个函数调用编写额外代码)?

【问题讨论】:

  • 你使用的是什么 Promise 实现?能改吗?
  • 不完全确定您在问什么,但 PDF.js 定义了 Promise 对象 (new Promise(...))。它在他们的核心文件中,所以我想尽可能避免更改该代码。

标签: javascript promise


【解决方案1】:

您遇到的问题是then 回调中的异常确实拒绝了.then() 返回的承诺,而不是调用您传入的错误处理程序。这只会触发承诺中的错误on 你称之为.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 自己实现 like this

有什么方法可以强制 promise 函数像平常一样记录运行时错误(无需为每个函数调用编写额外代码)?

没有。那不是how they were designed

【讨论】:

  • 叹息,这对我来说似乎非常愚蠢。为什么要破坏基本的调试功能?
  • @Woodgnome 顺序类比会是什么样子?如果你有一个带有console.logcatch { 子句,你必须重新抛出。
  • @BenjaminGruenbaum:但是如何编写不使用try catch 的类比?有了 Promise,你就明确地添加了一些东西。
  • @Bergi 和 try/catch 你还必须明确添加一些内容,如果你想记录并保持异常传播,你需要 catch(e){ 然后 throw e; - 就像你必须 @ 987654339@ 然后throw e; 承诺。
  • @BenjaminGruenbaum:不,当我省略 try catch 时,异常会冒泡并自动记录为未处理......
【解决方案2】:

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

您可以做的一件事是更改 try...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 承诺,这个技巧可能行不通。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-15
    • 1970-01-01
    • 2019-08-20
    • 2018-08-26
    • 2020-06-23
    • 2016-10-05
    • 1970-01-01
    相关资源
    最近更新 更多