捕获JavaScript中的Promises中的Promises中生成的错误

时间:2014-07-30 10:55:37

标签: javascript node.js error-handling promise bluebird

是否有可能在Promises中出现错误?

请参阅下面的代码以供参考,我希望promise1.catch能够捕获promise2中生成的错误(当前不能使用此代码):

function test() {
    var promise1 = new Promise(function(resolve1) {
        var promise2 = new Promise(function(resolve2) {
            throw new Error('Error in promise2!');
        });

        promise2.catch(function(error2) {
            console.log('Caught at error2', error2);
        });
    });

    promise1.catch(function(error1) {
        console.log('Caught at error1', error1);
    });
}

test();

1 个答案:

答案 0 :(得分:6)

是!!

Promises中的错误传播是其最强大的诉讼之一。它的行为与同步代码完全相同。

try { 
    throw new Error("Hello");
} catch (e){
    console.log('Caught here, when you catch an error it is handled');
}

非常相似:

Promise.try(function(){
    throw new Error("Hello");
}).catch(function(e){
    console.log('Caught here, when you catch an error it is handled');
});

就像在顺序代码中一样,如果你想对错误做一些逻辑而不是将其标记为已处理 - 你需要重新抛出它:

try { 
   throw new Error("Hello");
} catch (e){
    console.log('Caught here, when you catch an error it is handled');
    throw e; // mark the code as in exceptional state
}

哪个成为:

var p = Promise.try(function(){
   throw new Error("Hello");
}).catch(function(e){
    console.log('Caught here, when you catch an error it is handled');
    throw e; // mark the promise as still rejected, after handling it.
});

p.catch(function(e){
     // handle the exception
});

请注意,在Bluebird中你可以有类型和条件捕获,所以如果你所做的就是承诺的类型或内容的if来决定是否处理它 - 你可以保存

var p = Promise.try(function(){
   throw new IOError("Hello");
}).catch(IOError, function(e){
    console.log('Only handle IOError, do not handle syntax errors');
});

您还可以使用.error来处理源自promisified API的OperationalError。通常,OperationalError表示您可以从中恢复的错误(与程序员错误相比)。例如:

var p = Promise.try(function(){
   throw new Promise.OperationalError("Lol");
}).error(function(e){
    console.log('Only handle operational errors');
});

这样做的好处是不会在代码中隐藏TypeError或语法错误,这在JavaScript中会很烦人。