一、基本使用

1-1 基础语法

  1. try {
  2. tryCode - 尝试执行的代码块
  3. }
  4. catch(error) {
  5. catchCode - 捕获错误的代码块
  6. }
  7. finally {
  8. finallyCode - 无论 try / catch 结果如何都会执行的代码块
  9. }

1-2 利用try和catch跳出forEach循环

  1. let list =['001','002','003','004']
  2. try {
  3. list.forEach(item => {
  4. if (item === '002') {
  5. throw new Error('id不能等于002');
  6. }
  7. });
  8. }
  9. catch (error) {
  10. console.error(error)//Error: id不能等于002
  11. };
  12. console.log("如果看见了这段话说明代码没有被报错所阻塞");

二、try中return,finally语句还执行吗?

  1. // 情况一、try 中 return 执行了但是没有立即返回,而是先执行了 finally
  2. function kaimo(){
  3. try{
  4. return 0;
  5. } catch(err) {
  6. console.log(err)
  7. } finally {
  8. console.log("a")
  9. }
  10. }
  11. console.log(kaimo()); // a 0
  12. // 情况二:finally 中的 return 覆盖了 try 中的 return
  13. function kaimo(){
  14. try{
  15. return 0;
  16. } catch(err) {
  17. console.log(err)
  18. } finally {
  19. return 1;
  20. }
  21. }
  22. 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 中,把不带控制能力的语句称为普通语句
image.png

  • 普通语句执行后,会得到 [[type]] 为 normal 的 Completion Record,JavaScript 引擎遇到这样的 Completion Record,会继续执行下一条语句
  • 浏览器控制台显示的正是语句的 Completion Record 的 [[value]]


    3-3 语句块中Completion Record

  • 如果语句块内部的语句的 Completion Record 的 [[type]] 如果不为 normal,会打断语句块后续的语句执行

  • 在语句块中产生的非 normal 的完成类型可以穿透复杂的语句嵌套结构,产生控制效果 ```javascript // 在每一行的注释中为 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

```