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
何时被调用为“链的更上游”?请提供更多的上下文,我们将对其进行整理。