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

  • 相关阅读:
    Django Admin 管理工具
    老男孩培训机构老师的博客
    pycharm版本选择并安装
    Linux命令-自动挂载文件/etc/fstab功能详解
    django urls路由匹配分发
    django templates模板
    Django models模型
    django views视图函数
    JDK与JRE、JVM三者间的关系及JDK的安装部署
    django 第一个项目测试
  • 原文地址:https://www.cnblogs.com/liuye1990/p/9373900.html
Copyright © 2011-2022 走看看