如何在Q promise中显示未处理错误的异常

时间:2014-12-13 19:34:31

标签: q

我注意到如果.then()回调由于任何错误(例如对未定义变量的操作)而失败并且没有关联.catch(),则会自动忽略该错误。

这在发展过程中非常不舒服。

例如,此代码将退出而不显示任何错误:

var Q = require('q');

var promise = Q('something');
promise
.then(function() {
  buggyCode();
})

可能的解决方法是手动添加这样的错误处理程序,但是没有内置的内容吗?

.catch(function(error) {
  console.error(error.stack);
})

2 个答案:

答案 0 :(得分:3)

Apparently this is a limitation of Q

为了使错误处理稍微冗长,有方法.done(),应该在所有其他处理程序之后调用并执行错误报告,类似于我在问题中发布的代码段。

这不完美,因为它需要每个承诺 - 消费者功能调用.done()才能使此检查有效。

答案 1 :(得分:1)

这不一定是Q的限制。

您的原始示例使用的then()没有catch(),这有点像Q的反模式。then()旨在消耗任何拒绝或抛出错误,返回拒绝承诺自己;这就是为什么你必须“catch()”被拒绝的承诺,或者它会消失在虚空中:

someFn()
  .then(doStuff)
  .catch(handleError)

如果您的目标是允许抛出异常,done() is intended for this purpose,因为它会冒出其处理程序中抛出的任何错误,从而允许更传统的错误处理方法:

try {
    someFnThatGeneratesAnError().done()
} catch(e) { ... }

As you mentioned,在done()之后需要catch()来表示错误处理程序可能抛出的任何异常,但是Q has a global onerror属性允许您提供处理程序对于未处理done()的情况,您可以从单个调用中省略此项,并根据需要全局捕获它们。

Here is an example显示使用catch()onerror进行错误处理,同时显示then()如何处理与done()相关的错误。