logan70 / Blog

写博客的地方,觉得有用的给个Star支持一下~
81 stars 9 forks source link

执行机制 - try-catch-finally执行机制 #32

Open logan70 opened 4 years ago

logan70 commented 4 years ago

try-catch-finally执行机制

ECMA标准定义

执行过程

  1. 执行 try 中代码,将执行结果标记为Result
  2. try 中执行代码报错,则执行 catch 中代码,并用执行结果更新 Result
  3. 执行 finally 中代码,若有返回值,则用返回值更新 Result,完成执行过程。

主要有以下几个坑点要注意避免:

/* ------ `finally`中代码一定会执行 ------ */
function test1() {
  try {
    console.log('try')
    throw Error()
  } catch (e) {
    console.log('catch')
    return
  } finally {
    console.log('finally')
  }
}
test1()
// <- try
// <- catch
// <- finally

/* ------ `finally`中代码执行完才算执行完成 ------ */
function test2() {
  try {
    console.log('try_log');
    return 'try_return'
  } finally {
    console.log('finally_log')
  }
}

console.log(test2())
// <- try_log
// <- finally_log
// <- try_return

/* ------ `finally`中的return会覆盖try/catch中的return ------ */
function test3() {
  try {
    return 'try_return'
  } finally {
    return 'finally_return'
  }
}
console.log(test3())
// <- finally_return

function test4() {
  try {
    throw Error()
  } catch (e) {
    return 'catch_return'
  } finally {
    return 'finally_return'
  }
}

console.log(test4())
// <- finally_return