我将外部代码作为node.js服务的第三方扩展运行。API方法返回promises。已解决的承诺意味着操作执行成功,失败的承诺意味着在执行操作时出现问题。
这就是我遇到麻烦的地方。
由于第三方代码是未知的,可能存在错误、语法错误、类型问题,以及任何可能导致node.js抛出异常的东西。
然而,由于所有代码都被封装在promises中,这些抛出的异常实际上是作为失败的promises返回的。
我试图将函数调用放在try/catch块中,但从未触发过:
// worker process
var mod = require('./3rdparty/module.js');
try {
mod.run().then(function (data) {
sendToClient(true, data);
}, function (err) {
sendToClient(false, err);
});
} catch (e) {
// unrecoverable error inside of module
// ... send signal to restart this worker process ...
});
在上面的psuedo-code示例中,当抛出一个错误时,它出现在失败的promise函数中,而不是catch中。
据我所知,这是一个功能,而不是一个问题,与承诺。然而,我很难理解为什么你总是想把异常和预期的拒绝完全一样地对待。
一种情况是关于代码中的实际bug,可能是不可恢复的--另一种情况是可能缺少配置信息,或者参数,或者一些可以恢复的东西。
谢谢你的帮助!
发布于 2013-10-23 05:41:21
拒绝承诺只是一种失败的抽象形式。节点式回调(err,res)和异常也是如此。因为promises是异步的,所以你不能使用try-catch来实际捕获任何东西,因为错误很可能不会发生在事件循环的相同节拍中。
一个简单的例子:
function test(callback){
throw 'error';
callback(null);
}
try {
test(function () {});
} catch (e) {
console.log('Caught: ' + e);
}
在这里我们可以捕获一个错误,因为函数是同步的(尽管是基于回调的)。另一个:
function test(callback){
process.nextTick(function () {
throw 'error';
callback(null);
});
}
try {
test(function () {});
} catch (e) {
console.log('Caught: ' + e);
}
现在我们抓不到错误了!唯一的选择是在回调中传递它:
function test(callback){
process.nextTick(function () {
callback('error', null);
});
}
test(function (err, res) {
if (err) return console.log('Caught: ' + err);
});
现在它的工作方式就像第一个example.The一样适用于promises:您不能使用try-catch,所以您可以使用拒绝来处理错误。
https://stackoverflow.com/questions/19528705
复制相似问题