一、基本使用
1-1 基础语法
try {
tryCode - 尝试执行的代码块
}
catch(error) {
catchCode - 捕获错误的代码块
}
finally {
finallyCode - 无论 try / catch 结果如何都会执行的代码块
}
1-2 利用 try 和 catch 跳出 forEach 循环
let list =['001','002','003','004']
try {
list.forEach(item => {
if (item === '002') {
throw new Error('id不能等于002');
}
});
}
catch (error) {
console.error(error) // Error: id不能等于002
};
console.log("如果看见了这段话说明代码没有被报错所阻塞");
二、在 try 中 return,那 finally 语句还执行吗?
// 情况一、try 中 return 执行了但是没有立即返回,而是先执行了 finally
function kaimo(){
try{
return 0;
} catch(err) {
console.log(err)
} finally {
console.log("a")
}
}
console.log(kaimo()); // a 0
// 情况二:finally 中的 return 覆盖了 try 中的 return
function kaimo(){
try{
return 0;
} catch(err) {
console.log(err)
} finally {
return 1;
}
}
console.log(kaimo()); // 1
三、Completion Record
3-1 Completion Record 概念
Completion Record 用于描述语句执行过程,表示一个语句执行完之后的结果,它有三个字段
-
[[type]]:表示完成的类型,有 break、continue、return、throw、normal 几种类型
-
[[value]]:表示语句的返回值,如果语句没有,则是 empty
-
[[target]]:表示语句的目标,通常是一个 JavaScript 标签
JavaScript 使用 Completion Record 类型,控制语句执行的过程。
3-2 普通语句执行后的 Completion Record
普通语句:在 JavaScript 中,把不带控制能力的语句称为普通语句
- 普通语句执行后,会得到 [[type]] 为 normal 的 Completion Record,JavaScript 引擎遇到这样的 Completion Record,会继续执行下一条语句
- 浏览器控制台显示的正是语句的 Completion Record 的 [[value]]
3-3 语句块中 Completion Record
- 如果语句块内部的语句的 Completion Record 的 [[type]] 如果不为 normal,会打断语句块后续的语句执行
- 在语句块中产生的非 normal 的完成类型可以穿透复杂的语句嵌套结构,产生控制效果
// 在每一行的注释中为 Completion Record
// 正常情况
{
var i = 1; // normal, empty, empty
i ++; // normal, 1, empty
console.log(i) //normal, undefined, empty
} // normal, undefined, empty
// 加入return情况
{
var i = 1; // normal, empty, empty
return i; // return, 1, empty
i ++;
console.log(i)
} // return, 1, empty