首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >promises中的异常处理、抛出的错误

promises中的异常处理、抛出的错误
EN

Stack Overflow用户
提问于 2013-10-23 05:27:57
回答 1查看 11.3K关注 0票数 19

我将外部代码作为node.js服务的第三方扩展运行。API方法返回promises。已解决的承诺意味着操作执行成功,失败的承诺意味着在执行操作时出现问题。

这就是我遇到麻烦的地方。

由于第三方代码是未知的,可能存在错误、语法错误、类型问题,以及任何可能导致node.js抛出异常的东西。

然而,由于所有代码都被封装在promises中,这些抛出的异常实际上是作为失败的promises返回的。

我试图将函数调用放在try/catch块中,但从未触发过:

代码语言:javascript
复制
// 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,可能是不可恢复的--另一种情况是可能缺少配置信息,或者参数,或者一些可以恢复的东西。

谢谢你的帮助!

EN

回答 1

Stack Overflow用户

发布于 2013-10-23 05:41:21

拒绝承诺只是一种失败的抽象形式。节点式回调(err,res)和异常也是如此。因为promises是异步的,所以你不能使用try-catch来实际捕获任何东西,因为错误很可能不会发生在事件循环的相同节拍中。

一个简单的例子:

代码语言:javascript
复制
function test(callback){
    throw 'error';
    callback(null);
}

try {
    test(function () {});
} catch (e) {
    console.log('Caught: ' + e);
}

在这里我们可以捕获一个错误,因为函数是同步的(尽管是基于回调的)。另一个:

代码语言:javascript
复制
function test(callback){
    process.nextTick(function () {
        throw 'error';
        callback(null); 
    });
}

try {
    test(function () {});
} catch (e) {
    console.log('Caught: ' + e);
}

现在我们抓不到错误了!唯一的选择是在回调中传递它:

代码语言:javascript
复制
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,所以您可以使用拒绝来处理错误。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19528705

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档