zoukankan      html  css  js  c++  java
  • 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的执行。

  • 相关阅读:
    31、状态模式(详解版)
    33、中介者模式(详解版)
    36、备忘录模式(详解版)
    34、迭代器模式(详解版)
    30、责任链模式(职责链模式)详解
    29、命令模式(详解版)
    32、观察者模式(Observer模式)详解
    37、解释器模式(详解版)
    35、访问者模式(Visitor模式)详解
    28、策略模式(策略设计模式)详解
  • 原文地址:https://www.cnblogs.com/cotton/p/3785999.html
Copyright © 2011-2022 走看看