Node.js NodeJS正在接受回调抛出的异常

Node.js NodeJS正在接受回调抛出的异常,node.js,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'

假设以下代码:

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[error info here]”语句被打印出来,但throw语句显然被忽略。该应用程序很高兴地继续执行它被指示执行的任何其他操作,并且不会像预期的那样崩溃。为什么?

我从未在我使用的特定库中找到答案,但在切换到Q库后,它暴露了一个关键步骤,我以前可能也错过了这一步骤。如果承诺链的顶层没有拒绝处理程序,则可能会忽略该异常。根据Q文档,解决此问题的方法是始终在链的顶部调用
.done()
,将所有挂起的异常刷新回调用方。

这是您的模块,您是否为“uncaughtException”设置了事件处理程序?否。在内部,模块使用promise库。它在有问题的代码周围有一个try/catch,并在catch语句中调用reject(e)。我可以验证此代码是否正确执行,因为throw语句正上方的console.log语句会打印预期的错误。这里只忽略了throw语句。另外,处理promise拒绝的中间代码随后执行回调函数,并将错误作为第一个参数。除非它提供了一些我不知道的错误处理机制,否则该库非常糟糕,内部使用的承诺正在吞噬你的异常。你能在示例代码中以一种可以遵循的方式命名你的函数吗?这是函数中的
违规代码吗?在您的错误示例中,
myModule.doStuff
何时被调用为“链的更上游”?请提供更多的上下文,我们将对其进行整理。