从回调处理程序捕获错误

时间:2019-05-25 15:12:46

标签: javascript node.js error-handling

人们的看法是,如果在Promise中出错,则将调用catch处理程序,但在以下情况下(如果涉及回调)则不会调用该处理程序。

请考虑这种情况,因为回调函数中发生错误,并且我认为范围发生了变化,因为该回调函数不再位于PromiseCatcher的调用堆栈下,而其他人正在调用您的回调。 (希望有人可以从技术上正确地表达这一点。)

function query(sql, fn) { 
    setTimeout(fn, 1000);
}

function getUsers() {
    return new Promise(function (resolve, reject) {
        query("SELECT * FROM user", function(){ // callback crashes
            console.log(b); // undefined var, crash + stack trace
        });
    });
}

getUsers().then(console.log, function(e){
    console.log("caught in catch", e); // objective is to catch all errors here
})

尝试01 失败

我在promise中使用try-catch:

function getUsers() {
    return new Promise(function (resolve, reject) {
        try {
            query("SELECT * FROM user", function(){
                console.log(b); // undefined variable
            });
        } catch(e) {
            console.log("trying to catch error but no success", e)
            reject(e);
        }
    });
}

尝试02 成功

我在回调方法中放置了一个try-catch:

function getUsers() {
    return new Promise(function (resolve, reject) {
        query("SELECT * FROM user", function(){
            try {
                console.log(b); // undefined variable
            } catch(e) {
                console.log("caught finally")
                reject(e); // have to manually reject it.
            }
        });
    });
}

只是想知道是否有人可以给出更好的建议,在嵌套在我的promise中的每个回调方法中定义try catch有点麻烦。

我的目标是在catch处理程序中接收所有错误。

对建议的副本进行回复

我认为这个问题不是重复的of this one-我认为情况完全不同。 (链接的答案是关于捕获所有拒绝的,而在这个问题中,我在无法报告的回调中更深处发生了错误。)

我的问题涉及一个在带有回调的promise中嵌套函数的场景。该回调只是流氓。

简单地,将嵌套的回调函数放到promise中的函数将无法报告,并且任何错误都会使具有堆栈跟踪的程序崩溃。

0 个答案:

没有答案