首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在JavaScript的Promises中捕获Promises中生成的错误

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

Stack Overflow用户
提问于 2014-07-30 18:55:37
回答 1查看 1.9K关注 0票数 3

有没有可能在Promise中出现错误?

请看下面的代码作为参考,我想让promise1.catch捕获promise2中生成的错误(当前代码不适用于此代码):

代码语言:javascript
复制
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();
EN

回答 1

Stack Overflow用户

发布于 2014-07-30 19:18:12

是的!!

promises中的错误传播是它最强大的优势之一。它的行为与同步代码中的行为完全相同。

代码语言:javascript
复制
try { 
    throw new Error("Hello");
} catch (e){
    console.log('Caught here, when you catch an error it is handled');
}

非常类似于:

代码语言:javascript
复制
Promise.try(function(){
    throw new Error("Hello");
}).catch(function(e){
    console.log('Caught here, when you catch an error it is handled');
});

就像在顺序代码中一样,如果您想对错误执行一些逻辑,但不想将其标记为已处理-您可以重新抛出它:

代码语言:javascript
复制
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
}

它变成了:

代码语言:javascript
复制
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中,您可以使用类型捕获和条件捕获,因此,如果您所做的只是对promise的类型或内容执行if操作,以决定是否处理它-您可以保存它。

代码语言:javascript
复制
var p = Promise.try(function(){
   throw new IOError("Hello");
}).catch(IOError, function(e){
    console.log('Only handle IOError, do not handle syntax errors');
});

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

代码语言:javascript
复制
var p = Promise.try(function(){
   throw new Promise.OperationalError("Lol");
}).error(function(e){
    console.log('Only handle operational errors');
});

这样做的好处是不会使代码中的TypeError或语法错误静默,这在JavaScript中可能会很烦人。

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

https://stackoverflow.com/questions/25035019

复制
相关文章

相似问题

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