NodeJS吞噬了我从回调中抛出的异常

时间:2015-05-12 10:09:16

标签: node.js

假设以下代码:

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语句显然被忽略了。该应用程序愉快地继续做任何其他指示做的事情,并没有按预期崩溃。为什么呢?

1 个答案:

答案 0 :(得分:1)

我从来没有找到我使用的特定库的答案,但是在切换到Q库之后,它暴露了一个关键的步骤,我可能也已经失踪了。如果在promise链的顶层没有拒绝处理程序,则可能会吞下该异常。根据Q文档,解决这个问题的方法是始终在链的顶部调用.done(),将任何挂起的异常刷回给调用者。