try...catch...finally對return和throw Error的處理

try...catch...finally 組合使用時,若是他們的代碼塊中有return或者拋出異常時會怎麼樣呢?函數

first 🌰

通常狀況ui

function foo () {
  try {
    console.log('run try')
  } catch (error) {
    console.log(error)
  }
  finally{
    console.log('run finally')
  }
  console.log('run foo')
}
console.log(foo())
// run try
// run finally
// run foo
// undefined
複製代碼

上面的代碼,先執行 try 中的代碼,打印 run try, 沒有異常拋出,進入 finally ,打印 run finally,最後執行打印 run foo。函數執行結束,沒有返回值,打印 undefinedspa

second 🌰

try 中有returncode

function foo () {
  try {
    return 1
  } catch (error) {
    console.log(error)
  }
  finally{
    console.log('run finally')
  }
  console.log('never run')
}
console.log(foo())
// run finally
// 1
複製代碼

上述代碼先執行try,把函數foo 的返回值設置爲1,而後執行finally,打印 run finally,由於函數有返回值了,結束運行,打印返回值 1ip

third 🌰

finally中有 returnstring

function foo () {
  try {
    return 1
  } catch (error) {
    console.log(error)
  }
  finally{
    console.log('run finally')
    return 2
  }
  console.log('never run')
}
console.log(foo())
// run finally
// 2
複製代碼

上面的代碼在 finally 中加入了 return 2,最終函數的返回值爲 2,覆蓋了 try 中的返回值。it

結論一:

try...finally 組合使用時,若是 finally 中設置了返回值,此返回值會覆蓋 try 中的返回值,沒有設置的話就不會覆蓋io

fourth 🌰

try 中拋出異常console

function foo () {
  try {
    throw 0
    return 1
  } catch (error) {
    console.log(error)
  }
  finally{
    console.log('run finally')
  }
  console.log('run foo')
}
console.log(foo())
// 0
// run finally
// run foo
// undefined
複製代碼

上面的代碼 try 中拋出異常,return 1 沒有執行,進入 catch 流程,打印 0,而後進入 finally 流程,打印 run finally ,此時函數尚未返回值,繼續執行打印 run foo , 最後函數執行完畢,打印 undefinedfunction

若是在 finally中加入 return 2, 那麼函數返回值會是 2

fifth 🌰

finally中拋出異常

function foo () {
  try {
    return 1
  } catch (error) {
    console.log(error)
  }
  finally{
    console.log('run finally')
    throw 2
  }
  console.log('never run')
}
console.log(foo())
// run finally
// Uncaught 2
複製代碼

上面的代碼 finally中拋出異常,函數就此終止。異常沒有被捕獲,後面的程序結束執行。同時,try中函數的返回值 1 被丟棄

結論二:

若是 finally 中拋出異常(不管是有意仍是無心),函數就會在此處終止。若是此前 try 中 已經有 return 設置了返回值,則該值會被丟棄。

相關文章
相關標籤/搜索