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
猜你喜欢
- Wingdings字体,Symbol字体<html> <head> <title>
- 高可用架构对于互联网服务基本是标配,无论是应用服务还是数据库服务都需要做到高可用。虽然互联网服务号称7*24小时不间断服务,但多多少少有一些
- hello,大家好,我是Dream。马上就跨年了,为了广大的单身男性成员,我就慈悲一下,把我的存货–表白神器拿出来了,百试百灵(虽然我一次也
- 一、查询当前部门下的所有子部门WITH dept AS ( SELECT *
- 问题: pydev使用wx库开发的过程中,import时碰到wx可以识别,但是其它很多函数和变量上面全部是红叉,即无法识别。 解决方法: 1
- 1 作用注意此处Tensorflow版本是2.0+。由于本人是Pytorch用户,对Tensorflow不是很熟悉,在读到用tf写的代码时就
- 一、初识正则表达式正则表达式 是一个特殊的字符序列,一个字符串是否与我们所设定的这样的字符序列,相匹配快速检索文本、实现替换文本的操作jso
- 本文实例为大家分享了python可视化动态CPU性能监控的具体代码,供大家参考,具体内容如下打算开发web性能监控,以后会去学js,现在用m
- Go语言要打印彩色字符与Linux终端输出彩色字符类似,以黑色背景高亮绿色字体为例:fmt.Printf("\n %c
- 本文详细介绍了array_slice函数的详细用法以及一些常用的array_slice实例程序,分享给大家供大家参考。具体分析如下:arra
- 一、项目展示项目是一个简单实用的二维码生成器。使用者可以在生成器中输入文字生成二维码,也可以在识别器中识别二维码的内容二、项目核心代码二维码
- 目录JS 函数的 call、apply 及 bind 方法一、call() 方法1、call()方法的模拟实现二、apply() 方法1、a
- Django实现内容缓存:1、内存缓存settings.py文件配置CACHES = { 'default':
- 使用php就不一样了,php包含了zlib的链接库,可以直接使用其相关功能,下面是我写的压缩和结压缩swf文件的例子: //没有加入判断sw
- 什么是转义字符转义字符是一个计算机专业词汇。在计算机当中,我们可以写出123 ,也可以写出字母abcd,但有些字符我们无法手动书写,比如我们
- 本文实例讲述了Python单元测试与测试用例。分享给大家供大家参考,具体如下:单元测试与测试用例简介测试用例是一组单元测试,这些单元测试一起
- 在来回切换中英文输入法的时候连按两下shift总是会蹦出来全局搜索框真的很是麻烦,现在是把这个框给禁用掉1.按ctrl+shift+a,弹出
- Python pip安装lxml出错的问题解决办法1. 在使用pip安装lxml过程中出现了一下错误: &
- b.php的代码 <?php //只能通过post方式访问 if ($_SERVER['REQUEST_METHOD'
- 后边要做一个微信小程序,并要能获取用户微信绑定的手机号码。而小程序开发文档上边提供的获取手机号码的接口(getPhoneNumber())返