假设以下代码:
myModule.doStuff(options, function(err, results) {
if (err) console.log('e', err);
if (err) throw err;
console.log(results);
});
违规代码是:
return new Promise(function(resolve, reject) {
try {
throw new Error('test error');
resolve('success');
} catch (ex) {
console.log('r', ex);
reject(ex);
}
});
然后进一步向上链:
self.adapter
.collect(self.options)
.then(function(data) {
self.callback(null, data);
if (self.runnable) {
setTimeout(self.collect.bind(self), 2000);
}
}, function(error) {
self.callback(error);
});
' e [错误信息]'语句打印,但throw语句显然被忽略了。该应用程序愉快地继续做任何其他指示做的事情,并没有按预期崩溃。为什么呢?
答案 0 :(得分:1)
我从来没有找到我使用的特定库的答案,但是在切换到Q库之后,它暴露了一个关键的步骤,我可能也已经失踪了。如果在promise链的顶层没有拒绝处理程序,则可能会吞下该异常。根据Q文档,解决这个问题的方法是始终在链的顶部调用.done()
,将任何挂起的异常刷回给调用者。