码迷,mamicode.com
首页 > 编程语言 > 详细

Python中关于try...finally的一些疑问

时间:2014-06-15 06:47:20      阅读:228      评论:0      收藏:0      [点我收藏+]

标签:style   class   blog   code   http   color   

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

 

 

Python中关于try...finally的一些疑问,布布扣,bubuko.com

Python中关于try...finally的一些疑问

标签:style   class   blog   code   http   color   

原文地址:http://www.cnblogs.com/wang-shuai/p/3785999.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!