JavaScript 为什么我们无法在函数外部捕获错误
在本文中,我们将尝试理解为什么以及我们如何无法在函数外部捕获错误,并通过JavaScript中的一个示例来解决这个问题。
首先,我们将通过一个示例和一些理论解释更清楚地理解我们的问题陈述:
示例1:
- 在这个示例中,我们将创建一个函数,它将接受一个整数参数值,并在函数中进行后续的使用。
- 在函数内部,我们将尝试创建一个带有finally的try-catch块(不管是否捕获到异常,finally块的结果都会被打印出来)。
- 然后,在try块中,我们会检查整数值,在catch块中,我们将捕获在检查整数值后在try块中捕获到的错误。除此之外,在catch块中,我们还将抛出另一个错误,并在稍后捕获它。
- 在finally块中,我们将通过console.log()打印一个语句(以字符串形式),然后使用return语句返回整数参数。
- 接下来,我们将创建另一个函数,在这个函数中,我们将使用同样的try/catch块捕获先前创建的函数中捕获到的错误。
Javascript
<script>
let checkPassedValue = (num) => {
try {
if (num === 5)
console.log(`{num} found successfully..!!`);
else
throw new Error(`{num} is not the required number`);
} catch (error) {
console.log(error.message);
throw new Error("Error thrown in Catch Block...!!");
} finally {
console.log("Finally block's data content...");
return num;
}
};
let dataChecking = () => {
try {
let data = checkPassedValue(10);
console.log("Data value received from "
+ "First Function is: " + data);
} catch (error) {
console.log("Catched error in next function is: "
+ error.message);
}
};
dataChecking();
</script>
输出: 在下面显示的输出中,我们将看到我们的错误没有正确地从第一个函数传递到第二个函数。
10 is not the required number
Finally block's data content...
Data value received from First Function is: 10
说明:
- catch块失败的原因是无法捕获在前一个函数的try块中捕获的错误,原因是return语句被置于finally块本身内部。
- 这个return语句实际上会优先执行,改变了我们作为用户无法接收或捕获以前捕获的错误的结果。
- 为了捕获错误,我们在finally块中不应该使用任何return语句,我们将在下面的另一个示例中展示它。
示例2:
- 在这个示例中,我们将利用上一个示例中的概念,包括函数声明,然后创建try/catch块以及finally块等等。
- 这里,我们将在finally块内部使用return语句来避免错误被正确缓存。
- 我们将不使用return语句,而是将返回的数据传递给console.log()语句,其他的事情和之前的示例一样。
- 在这里,我们将成功捕获错误,并且还能够将其打印在输出中。
JavaScript
<script>
let checkPassedValue = (num) => {
try {
if (num === 5)
console.log(`{num} found successfully..!!`);
else
throw new Error(`{num} is not the required number`);
} catch (error) {
console.log(error.message);
throw new Error("Error thrown in Catch Block...!!");
} finally {
console.log("Finally block's data content..." + num);
}
};
let dataChecking = () => {
try {
let data = checkPassedValue(10);
console.log("Data value received from "
+ "First Function is: " + data);
} catch (error) {
console.log("Catched error in next function is: "
+ error.message);
}
};
dataChecking();
</script>
输出:
10 is not the required number
Finally block's data content...10
Catched error in next function is: Error thrown in Catch Block...!!
极客教程