隨著async /await的出現,我最近發現自己在我的程式碼中使用了更多try /catch /finally。但老實說,我終於用“finally”做了一點練習。當我去實際使用它時,我有點不確定它的細節。所以我把幾個例子放在一起。
當你 throw 一個 catch
考慮你在一個catch塊跑出一個異常。在退出函式之前沒有什麼可以捕獲你的throw。那“ finally”會執行嗎??
function example() {
try {
fail()
}
catch (e) {
console.log("Will finally run?")
throw e
}
finally {
console.log("FINALLY RUNS!")
}
console.log("This shouldn't be called eh?")
}
example()
控制檯結果
Will finally run?
FINALLY RUNS!
Uncaught ReferenceError: fail is not defined
at example (<anonymous>:3:5)
at <anonymous>:15:2
finally執行,即使並沒有列印最後一個日誌語句!但它確實丟擲了錯誤。
你可以看到finally有點特別;它允許你在丟擲錯誤和離開函式之間執行,即使丟擲catch塊。
嘗試沒有捕獲(catch)
您是否知道如果您提供finally塊,您也不需要提供catch塊?你可能做到了,但值得一提!
接下來的問題是:即使在try塊中沒有出錯,finally塊也會被呼叫嗎?
function example() {
try {
console.log("Hakuna matata")
}
finally {
console.log("What a wonderful phrase!")
}
}
example()
控制檯結果
[log] Hakuna matata
[log] What a wonderful phrase!
是的,即使沒有出錯也會呼叫finally。當然,當does出錯時,它也會被呼叫。
這就是finally背後的想法 - 它可以讓你處理這兩種情況,正如你在這個例子中看到的那樣:
function example() {
try {
console.log("I shall try and fail");
fail();
}
catch (e) {
console.log("Then be caught");
}
finally {
console.log("And finally something?");
}
}
example()
控制檯結果
[log] I shall try and fail
[log]Then be caught
[log] And finally something?
那如果return了? finally還會執行嗎?
所以最後讓你在異常發生時自己清理。但是什麼時候什麼都不會出錯,你只是從函式中“返回”正常...在try塊中?
看看下面的例子。example()中的finally塊是否可以執行after你已經命中了return語句?
function example() {
try {
console.log("I'm picking up my ball and going home.")
return
}
finally {
console.log('Finally?')
}
}
example()
控制檯結果
[log] I'm picking up my ball and going home.
[log]Finally?
規則
try /catch /finally上的finally塊都將執行 - 即使你提前catch或'return`。
這就是它如此有用的原因;無論發生什麼情況,它都將執行,那麼這就是將,始終要執行的程式碼的理想場所,比如容易出錯的IO的清理程式碼。事實上,這就是本文的靈感來源。