首页 > 代码库 > Python中关于try...finally的一些疑问
Python中关于try...finally的一些疑问
最近看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的执行。
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。