人们的看法是,如果在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中的函数将无法报告,并且任何错误都会使具有堆栈跟踪的程序崩溃。