随着async/await的出现,我最近发现自己在我的代码中使用了更多的try/catch/finally。不过老实说,终于对“finally”有了一点练习。去实际使用的时候,对细节有点摸不着头脑。所以我整理了几个例子。当您抛出一个catch时,请考虑您是在一个catch块中抛出一个异常。在退出函数之前没有什么可以捕获你的抛出。那“终于”跑了吗??functionexample(){try{fail()}catch(e){console.log("Willfinallyrun?")throwe}finally{console.log("FINALLYRUNS!")}console.log("这应该't'tbecalledeh?")}example()consoleresultWillfinallyrun?FINALLYRUNS!UncaughtReferenceError:failisnotdefinedatexample(:3:5)at:15:2最后运行,即使没有打印最后一条日志语句!但它确实会引发错误。你可以看到finally有点特别;它允许您在抛出错误和离开函数之间运行,即使抛出catch块也是如此。Trywithoutcatch你知道吗,如果你提供了一个finally块,你也不需要提供一个catch块?你可能做到了,但值得一提!接下来的问题是:即使try块没有错误,finally块会被调用吗?functionexample(){try{console.log("Hakunamatata")}finally{console.log("Whatawonderfulphrase!")}}example()consoleresult[log]Hakunamatata[log]多么美妙的短语!是的,即使没有错误,finally也会被调用。当然,出错的时候也会调用。这就是finally背后的想法——它可以让你处理这两种情况,正如你在这个例子中看到的:fail();}catch(e){console.log("Thenbecaught");}finally{console.log("Andfinallysomething?");}}example()consoleresult[log]我会尝试失败[log]然后被抓住[log]最后是什么?如果它返回怎么办?最后还会执行吗?所以finally让你在异常发生的时候自己清理一下。但是当没有出现任何问题并且您只是从函数“返回”正常时......在try块中?看看下面的例子。example()中的finally块可以在您点击return语句后运行吗?functionexample(){try{console.log("I'mpickingmyballandgoinghome.")return}finally{console.log('Finally?')}}example()控制台结果[log]I'我拿起我的球回家了。[日志]最后?规则try/catch/finally上的finally块将全部运行-即使您提前捕获或“返回”。这就是它如此有用的原因;无论发生什么,它都会运行,因此它是放置要一直运行的代码的理想场所,例如用于容易出错的IO的清理代码。事实上,这就是这篇文章的灵感来源。