Blog icon indicating copy to clipboard operation
Blog copied to clipboard

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

Open logan70 opened this issue 5 years ago • 0 comments

try-catch-finally执行机制

ECMA标准定义

执行过程

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

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

  • trycatch 中的return语句不影响 finally中代码的执行
  • finally 中有 return 语句,会覆盖 trycatch 中的返回值
/* ------ `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

logan70 avatar Dec 03 '19 15:12 logan70