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

 

 

posted @ 2014-06-13 15:55  棉花年度  阅读(17795)  评论(1编辑  收藏  举报