Python学习之异常中的finally使用详解
作者:渴望力量的哈士奇 发布时间:2021-09-08 02:21:38
今天我们来学习一下 异常语法 中的另一个成员 —> finally ; 通过学习 finally ,可以帮助我们更好的处理异常。
finally 的功能与用法
finally 的功能:finally的是最后的意思,配合异常的语法来说,它就是最后执行的代码块。
无论是否发生了异常,一定会执行 finally 的代码块
在函数中,即便在 try 或 except 中进行了 return 也依旧会执行 finally 代码块
try 语法 至少要伴随 except 或 finally 中的一个
finally 的用法:示例如下
try:
<代码块1>
except:
<代码块2>
finally:
<代码块3>
finally 示例案例
def test():
try:
1 / 0
except Exception as e:
print(e)
finally:
print('通用异常捕获已完成')
result = test()
print(result)
# >>> 执行结果如下:
# >>> division by zero
# >>> 通用异常捕获已完成
finally 触发的必然性与优先级
接下来我们看看 在 try 或 except 中进行了 return 的场景:
def test():
try:
1 / 0
except Exception as e:
return e
finally:
print('通用异常捕获已完成')
result = test()
print(result)
# >>> 执行结果如下:
# >>> 通用异常捕获已完成
# >>> division by zero
这里我们是不是发现了一个问题?先输出的 finally 代码块,后输出的 except 的 代码块。
Python 程序的执行顺序是自上而下执行的,为什么会出现这样的结果呢?我么尝试在 except 的 代码块增加一行输出的测试代码,看一下执行的顺序究竟是什么样的。
def test():
try:
1 / 0
except Exception as e:
print('exception——test')
return e
finally:
print('通用异常捕获已完成')
result = test()
print(result)
# >>> 执行结果如下:
# >>> exception——test
# >>> 通用异常捕获已完成
# >>> division by zero
从执行结果可以得出结论,程序依然是自上而下执行的。其实造成这样结果的原因是捕获到异常后会将异常信息赋值给变量 e 返回,在调用test()时将返回值赋值给了 result ,因此在打印时可以得到的结果就是先输出的 finally 的代码块,再输出的 result 的赋值结果 。
同时也在次印证了我们上文针对 finally 的功能的描述 :try 或 except 中进行了 return 也依旧会执行 finally 代码块。
既然 except 的代码块我们得到了证实,那么 try 的代码块呢?
def test():
try:
print('try_test')
return 'try'
except Exception as e:
print(e)
finally:
print('通用异常捕获已完成')
result = test()
print(result)
# >>> 执行结果如下:
# >>> try_test
# >>> 通用异常捕获已完成
# >>> try
# >>> 得出了同样的 finally 必然触发性 的结论
再思考一个问题,之前我们的 finally 的代码块 都是输出的 print 语句,如果我们在 try 或 except 与 finally 的代码块 中都使用 return ,那么会返回谁的 return 的结果呢?
def test():
try:
1 / 0
except Exception as e:
return e
finally:
return '通用异常捕获已完成'
result = test()
print(result)
# >>> 执行结果如下:
# >>> 通用异常捕获已完成
从执行结果我们看到, except 与 finally 的代码块 中都使用 return ,同时我们也知道会先触发 except 代码块的 return ,但是最终返回的依然是 finally 的代码块 中都使用 return。
虽然 except 代码块有 return ,但是因为 finally 的代码块 中也使用了 return ,所以我们的程序最终还是选择了 finally 的代码块 中的 return 进行返回。最终得出 finally 的代码块 中的 return 返回的级别更高的结论。
try 语法 伴随 except 或 finally 的必然性
我们看下面的一个小例子
def test():
try:
1 / 0
finally:
print('通用异常捕获已完成')
result = test()
print(result)
# >>> 执行结果如下:
# >>> 通用异常捕获已完成
# >>> Traceback (most recent call last):
# >>> File "D:\PycharmProjects\XXX\XXX.py", line 81, in <module>
# >>> result = test()
# >>> File "D:\PycharmProjects\XXX\XXX.py", line 76, in test
# >>> 1 / 0
# >>> ZeroDivisionError: division by zero
可以看到,虽然产生了报错,但是我们的 finally 代码块依然被执行了。让我们试试在这种情况下,直接使用 return 会怎么样?
def test():
try:
1 / 0
finally:
return '通用异常捕获已完成'
result = test()
print(result)
# >>> 执行结果如下:
# >>> 通用异常捕获已完成
此时我们发现, finally 代码块依然被执行了,不仅如此,刚刚出现的错误也被忽略了。说明当 try 出现异常的时候会被直接忽略,直接跳转到 finally 的代码块。
这就是 try 与 finally 的组合效果,不过在我们平时的工作中,还是希望 使用 try 配合 except 将 异常类型(信息) 友好的打印出来,再进行return 会更好。
finally 的历史
在 python 2.5 版本之前, finally 需要独立使用不可以和 try 进行配合,在 python 2.5 版本 之后才演变成了现在这个样子。
如果未来有机会使用较老版本的 python ,看到这样的情况,不要觉得奇怪。
来源:https://blog.csdn.net/weixin_42250835/article/details/123490430
猜你喜欢
- 此类技巧还有很多,欢迎继续分享解析 URL从 James Padolsey 的 Blog中看到的个小技巧,就是利用 a 标签的 DOM 属性
- Python字符串拼接的几种方法整理第一种 通过加号(+)的形式print('第一种方式通过加号形式连接 :' + '
- 防止Application对象在多线程访问中出现错误asp代码处理代码如下(VB):<%Application.Lock()Appli
- 本文实例讲述了PHP共享内存使用与信号控制。分享给大家供大家参考,具体如下:共享内存共享内存的使用主要是为了能够在同一台机器不同的进程中共享
- 沟通的时候,一般我不主动说自己是做用户体验设计,也不说做以用户为中心的设计,包括UED, UCD。这种专业名词传达的太虚,你也许是名用户体验
- 本文列举了兼容 IE 和 FF 的换行 CSS 推荐样式,详细介绍了word-wrap同word-break的区别。兼容 IE 和 FF 的
- 前面简单介绍了Python字符串基本操作,这里再来简单讲述一下Python列表相关操作1. 基本定义与判断>>> dir(
- ul设置浮动后不能自适应高度,也就是不能撑开父容器,不能自适应内容的高度。解决方法是在ul结束标签前加个清除浮动。 &
- IE独有属性AlphaImageLoader用于修正7.0以下版本中显示PNG图片的半透明效果。这个滤镜的问题在于浏览器加载图片时它会终止内
- 一个动态数组 a,如果你已经使用redim 语句给它设定了大小,那么在此之后使用 ubound(a) 就可以得到它的上边界。如果你没有使用
- 简介在逛github时发现一个好玩的Go项目,彩色输出文本说明支持Linux彩色输出支持Windows彩色输出Golang IDE输出是不支
- 1.新建一个vs2003的web工程,取名为XMLTest &nbs
- 当使用AJAX进行GET请求的时候,会有一个现象就是刷新网页后,AJAX请求的数据没有改变,只有把IE的缓存清空,或者从新打开一个IE窗口的
- jQuery居然都没有JSON的decode和encode,精确类型判断也没有,囧……自己动手写吧!不过这些东西在网上都已经有很好的版本了,
- 项目运行环境阿里云(单核CPU, 1G内存, Ubuntu 14.04 x64 带宽1Mbps), 具体购买和ssh连接阿里云本文不做描述。
- 1、从半年以前要“去中心化”开始,豆瓣作了不少大的调整,重要的是上线了很多的新功能。同城、日记、相册、音乐试听、等等。2、一个多月来,豆瓣上
- 内容摘要:图片切换效果在网页制作中经常被使用,好的切换效果不仅增加了网站的实用行也提升了网站的趣味性。而图片切换方法有的使用flash来实现
- 本文实例为大家分享了python实现维吉尼亚算法的具体代码,供大家参考,具体内容如下1 Virginia加密算法、解密算法Vigenenre
- Python等工具确实是不错的工具,但是有时候不管是基础的Python还是Python的软件包都让我觉得对中文不是很亲近。时不时地遇到一点问
- 1,file_put_contents()函数 2,使用PHP内置缓存机制实现页面静态化:output_bufferingphp中outpu