博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Will it finally: 关于 try/catch 的一些细节
阅读量:6497 次
发布时间:2019-06-24

本文共 1756 字,大约阅读时间需要 5 分钟。

随着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 (
:3:5) at
: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的清理代码。事实上,这就是本文的灵感来源。

转载地址:http://sxuyo.baihongyu.com/

你可能感兴趣的文章
批处理用WINRAR只压缩某类型的文件
查看>>
我的友情链接
查看>>
Linux上vim编辑器快速入门
查看>>
手工kill病毒小方法--转自51CTO论坛
查看>>
Selenium代码示例
查看>>
memcached性能测试
查看>>
Chrome扩展入门开发
查看>>
[转]Android 之 Window、WindowManager 与窗口管理
查看>>
类加载器复习
查看>>
进程之multiprocessing模块代码篇
查看>>
android XMLPullParser读取xml文件
查看>>
硬件处理和软件处理之间的异同与边界
查看>>
ubantu apt-get源
查看>>
java学习记录【day10】
查看>>
Centos 5.6下squid 2.7 安装 (反向代理)
查看>>
DD-WRT中的各种无线模式
查看>>
2017金砖会议之spark
查看>>
OpenStack云第二天
查看>>
网络信息安全之防火墙入反病毒技术 (七)
查看>>
MountainLion安装xcode3.2.6
查看>>