Will it finally: 关于 try/catch 的一些细节
隨著async /await的出現(xiàn),我最近發(fā)現(xiàn)自己在我的代碼中使用了更多try /catch /finally。但老實(shí)說,我終于用“finally”做了一點(diǎn)練習(xí)。當(dāng)我去實(shí)際使用它時(shí),我有點(diǎn)不確定它的細(xì)節(jié)。所以我把幾個(gè)例子放在一起。
當(dāng)你 throw 一個(gè) catch
考慮你在一個(gè)catch塊跑出一個(gè)異常。在退出函數(shù)之前沒有什么可以捕獲你的throw。那“ finally”會(huì)運(yùn)行嗎??
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()控制臺(tái)結(jié)果
Will finally run? FINALLY RUNS! Uncaught ReferenceError: fail is not definedat example (<anonymous>:3:5)at <anonymous>:15:2finally運(yùn)行,即使并沒有打印最后一個(gè)日志語句!但它確實(shí)拋出了錯(cuò)誤。
你可以看到finally有點(diǎn)特別;它允許你在拋出錯(cuò)誤和離開函數(shù)之間運(yùn)行,即使拋出catch塊。
嘗試沒有捕獲(catch)
您是否知道如果您提供finally塊,您也不需要提供catch塊?你可能做到了,但值得一提!
接下來的問題是:即使在try塊中沒有出錯(cuò),finally塊也會(huì)被調(diào)用嗎?
function example() {try {console.log("Hakuna matata")}finally {console.log("What a wonderful phrase!")} }example()控制臺(tái)結(jié)果
[log] Hakuna matata [log] What a wonderful phrase!是的,即使沒有出錯(cuò)也會(huì)調(diào)用finally。當(dāng)然,當(dāng)does出錯(cuò)時(shí),它也會(huì)被調(diào)用。
這就是finally背后的想法 - 它可以讓你處理這兩種情況,正如你在這個(gè)例子中看到的那樣:
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()控制臺(tái)結(jié)果
[log] I shall try and fail [log]Then be caught [log] And finally something?那如果return了? finally還會(huì)執(zhí)行嗎?
所以最后讓你在異常發(fā)生時(shí)自己清理。但是什么時(shí)候什么都不會(huì)出錯(cuò),你只是從函數(shù)中“返回”正常...在try塊中?
看看下面的例子。example()中的finally塊是否可以運(yùn)行after你已經(jīng)命中了return語句?
function example() {try {console.log("I'm picking up my ball and going home.")return}finally {console.log('Finally?')} }example()控制臺(tái)結(jié)果
[log] I'm picking up my ball and going home. [log]Finally?規(guī)則
try /catch /finally上的finally塊都將運(yùn)行 - 即使你提前catch或'return`。
這就是它如此有用的原因;無論發(fā)生什么情況,它都將運(yùn)行,那么這就是將,始終要運(yùn)行的代碼的理想場所,比如容易出錯(cuò)的IO的清理代碼。事實(shí)上,這就是本文的靈感來源。
總結(jié)
以上是生活随笔為你收集整理的Will it finally: 关于 try/catch 的一些细节的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 每日两道前端面试题20190221
- 下一篇: 数据工程师妹子养成手记——数据库篇