在承诺中引发的例外情况未显示

时间:2014-12-07 20:43:08

标签: node.js exception promise es6-promise

我正在开发一个严重依赖Promise的节点模块。出于某种原因,当在Promise代码中引发异常时(例如“undefined不是函数”),异常消息不会显示在控制台中 - 承诺链似乎停止而没有任何反馈,我只能做所有事情猜猜是什么导致了这一点。 如何强制Node显示所有异常?

1 个答案:

答案 0 :(得分:2)

承诺是安全的 - 也就是说他们将投掷转换为拒绝。如果在then内引发异常,则会收到被拒绝的承诺,您可以恢复而不是使整个服务器崩溃。

较旧的承诺库以及本机承诺不具有“未处理的拒绝跟踪”功能,并且基本上可以抑制您的错误。较新的库具有“未处理的拒绝跟踪”功能,但不会显示您描述的行为。

您的选择是:

  • 使用像Bluebird promises这样的新库,它会将未处理的拒绝记录到您的控制台。那就是 - 图书馆实际上为你解决了这个问题。
  • 在某些库中,您可以在promise链的末尾使用.done将未处理的拒绝转换为抛出的异常。
  • 凭借本土承诺,这是一个真实,痛苦和开放的问题。您必须添加.catch(function(e){ setTimeout(function(){ throw e; }); }) - 明确不安全地抛出并导致错误显示。您必须为每个承诺链结束执行此操作。我个人觉得这很烦人。

请注意,预计v8将最终解决此问题并且行为与蓝鸟承诺相似,但我们还没有截止日期。一般来说,我认为原生承诺还没有为节点中的黄金时间做好准备,最好使用强大的库。