让我们以异步函数asyncFunction
为例,它采用布尔参数res
。如果res
为真,则promise将用字符串"0"解析;成功";。如果res
为假,则promise将以包含字符串"0"的错误对象拒绝;成功";。
const asyncFunction = (res) => {
return new Promise((resolve, reject) => {
setTimeout(() => {
if (res) return resolve("Success");
return reject(new Error("Error"));
}, 1000);
});
};
当使用try-catch块时,我从函数innerFunction
调用asyncFunction
。到目前为止还不错。
const innerFunction = async () => {
try {
return await asyncFunction(false); //Will reject
} catch (error) {
console.log("caught error inside innerFunction");
return error;
}
};
在outerFunction
中,我正在执行
const outerFunction = async () => {
try {
const result = await innerFunction();
console.log(result);
} catch (error) {
console.log("caught error inside outerFunction");
console.log(error);
}
};
最后,我正在运行外部函数。
outerFunction();
我本以为两个catch块都能捕捉到错误,但我错了。我想你不可能两次抓到同一个异常吗?我不确定,但我的猜测是,在幕后,Error对象被标记为"错误";"已处理";错误,因此在CCD_ 8中不会被识别为一个错误。(我很想了解一下!(
我的解决方案是在innerFunction中抛出一个新错误:
const innerFunction = async () => {
try {
return await asyncFunction(false); //Will reject
} catch (error) {
console.log("caught error inside innerFunction");
throw new Error(error);
}
};
我为篇幅太长而道歉,但最后,我的问题是:这是一个"正确的";处理必须处理outerFunction
中错误的情况的方法?有没有";"更好";怎么做?
谢谢!
不,您不能两次捕获相同的错误。中继错误的方法将是错误的。相反,我要做的只是转发输出并在外部函数中处理它们。
const innerFunction = async () => asyncFunction(false); // <-- Just return the outputs
const outerFunction = async () => {
try {
const result = await innerFunction(); // <-- Error is forwarded and thus handled
} catch (error) {
console.log("Caught error inside outerFunction");
}
};