最近看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的执行。

最新文章

  1. yii2获取登录前的页面url地址--电脑和微信浏览器上的实现以及yii2相关源码的学习
  2. apache_commons 之 双向Map DualHashBidiMap (使用及源码)
  3. C/C++ makefile自动生成工具(comake2,autotools,linux),希望能为开源做点微薄的贡献!
  4. 适配器模式 - Adapter
  5. ORACLE 11g 数据库体系结构图
  6. Windows创建文件链接
  7. Maven打jar发布包的常用配置
  8. DB、ETL、DW、OLAP、DM、BI关系结构图
  9. bootstrap-响应式图片、辅助类样式
  10. 1.python的第一步
  11. 关于 ASP.NET MVC 4 如果管理用户
  12. 如何让input之间无空隙
  13. Android 打造任意层级树形控件 考验你的数据结构和设计
  14. C#获取时间戳的方法
  15. windows下系统移植到linux下出现的问题
  16. js连接sqlserver进行查询
  17. Grafana中整个Dashboard报错问题解决
  18. ES6 Generators的异步应用
  19. Linux下高效指令
  20. linux systemd详解

热门文章

  1. WCF方式调用asmx设置cookie
  2. 浅谈HTML5拖放
  3. 池化 - Apache Commons Pool
  4. JAVA多线程下,获取递增的序列号
  5. 生成简历经验总结(解析HTML字符串)
  6. CentOS查看CPU、内存、网络流量和磁盘 I/O
  7. VMware下设置CentOS虚拟机与主机同一网段
  8. 初学swift笔记 方法(九)
  9. sqlite在Android上的一个bug:SQLiteCantOpenDatabaseException when nativeExecuteForCursorWindow
  10. 什麼是 N-key 與按鍵衝突?原理說明、改善技術、選購注意完全解析