Python中关于try...finally的一些疑问
2024-09-21 06:36:49
最近看Vamei的Python文章,其中一篇讲异常处理的,原本看完没啥疑惑,或许是自己想的简单了。
看到评论,一个园友的问题引起我的兴趣。
他的问题是
def func(x):
try:
return ++x
finally:
return x+1
print func(11)
你觉得是几?
看到问题,觉得肯定是12啊,这有什么问题呢?
下边看看我写的例子,就明白其中的问题了。
先看这个
def f():
try:
print 1
return 1
finally:
print 0
return 0
print f()
结果为 1 0 0
以运行结果为准,说明无论try里执行什么,即使是return,也会调用finally的。
但是有一个问题,为什么最后输出的不是1而是0呢?明明try里面已经返回1了!
看下边的代码
def f():
try:
print 1
return 1
finally:
print 0
#return 0
将finally的return屏蔽掉,你或许猜到结果了
结果为 1 0 1
诧异吗?
对比上个结果,说明try的返回值被finally的返回值覆盖了,或许是因为一个函数只能有一个返回值,以最后一个结果为准
由此我想再验证下else的情况,如下
def f():
try:
print 1
return 1
except:
return 2
else:
print 3
return 3
finally:
print 0
#return 0
你觉得,没有异常else会执行吗?
如你所料,并没有执行。
结果为 1 0 1
说明try里面运行完之后return,阻挡了else的执行,但是并没有影响finally的执行。
借用Vamer文章的两句话:
“如果try中没有异常,那么except部分将跳过,执行else中的语句。
finally是无论是否有异常,最后都要做的一些事情。”
这里补充一句,在含有return的情况下,并不会阻碍finally的执行。
最新文章
- yii2获取登录前的页面url地址--电脑和微信浏览器上的实现以及yii2相关源码的学习
- apache_commons 之 双向Map DualHashBidiMap (使用及源码)
- C/C++ makefile自动生成工具(comake2,autotools,linux),希望能为开源做点微薄的贡献!
- 适配器模式 - Adapter
- ORACLE 11g 数据库体系结构图
- Windows创建文件链接
- Maven打jar发布包的常用配置
- DB、ETL、DW、OLAP、DM、BI关系结构图
- bootstrap-响应式图片、辅助类样式
- 1.python的第一步
- 关于 ASP.NET MVC 4 如果管理用户
- 如何让input之间无空隙
- Android 打造任意层级树形控件 考验你的数据结构和设计
- C#获取时间戳的方法
- windows下系统移植到linux下出现的问题
- js连接sqlserver进行查询
- Grafana中整个Dashboard报错问题解决
- ES6 Generators的异步应用
- Linux下高效指令
- linux systemd详解