try...catch...finally
組合使用時,若是他們的代碼塊中有return或者拋出異常時會怎麼樣呢?函數
通常狀況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
。函數執行結束,沒有返回值,打印 undefined
spa
try
中有return
code
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
,由於函數有返回值了,結束運行,打印返回值 1
ip
finally
中有 return
string
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
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
, 最後函數執行完畢,打印 undefined
。function
若是在
finally
中加入return 2
, 那麼函數返回值會是2
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
設置了返回值,則該值會被丟棄。