Will it finally: 关于 try/catch 的一些细节

跟着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的清算代码。事实上,这就是本文的灵感泉源。

    原文作者:_小生_
    原文地址: https://segmentfault.com/a/1190000018259914
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞