zoukankan      html  css  js  c++  java
  • python的try finally (还真不简单)

    https://www.cnblogs.com/cotton/p/3785999.html

    def f():
        try:
            print 1
            return 1
        finally:
            print 0
            return 0

    print f()
    结果为 1 0 0
    以运行结果为准,说明无论try里执行什么,即使是return,也会调用finally的

    def f():
        try:
            print 1
            return 1
        finally:
            print 0
            #return 0

    将finally的return屏蔽掉,你或许猜到结果了

    结果为 1 0 1

    诧异吗?

    对比上个结果,说明try的返回值被finally的返回值覆盖了,或许是因为一个函数只能有一个返回值,以最后一个结果为准

    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中的语句。(前提是try里没有返回值)

    finally是无论是否有异常,最后都要做的一些事情。”(无论try里是否有返回值)

    这里补充一句,在含有return的情况下,并不会阻碍finally的执行。(但是会阻碍else)

    又增补了点测试:

    #根据  https://www.cnblogs.com/cotton/p/3785999.html 《Python中关于try...finally的一些疑问》
    
    
    
    def test_finally_return1():
        try:
            print(1)
            return 1
        finally:
            print(0)
            return 0
    
    
    def test_finally_return2():
        try:
            print(1)
            return 1
        finally:
            print(0)
            #return 0
    
    
    def test_else_finally1():
        try:
            print(1)
            return 1
        except:
            return 2
        else:
            print(3)
            return 3
        finally:
            print(0)
            #return 0
    
    def test_else_finally2():
        try:
            print(1)
            return 1
        except:
            return 2
        else:
            print(3)
            #return 3
        finally:
            print(0)
            return 0
    
    
    def test_else_finally3():
        try:
            print(1)
            #return 1
        except:
            print(2)
            #return 2
        else:
            print(3)
            #return 3
        finally:
            print(0)
            return 0
    
    def test_else_return1():
        try:
            print(1)
            return 1
        except:
            return 2
        else:
            print(3)
            return 3
        # finally:
        #     print(0)
            #return 0
    
    def test_else_return2():
        try:
            print(1)
            #return 1
        except:
            return 2
        else:
            print(3)
            return 3
        # finally:
        #     print(0)
            #return 0
    
    
    if __name__ == '__main__':
        print('测试1')
        print(test_finally_return1())
        print('测试2')
        print(test_finally_return2())
        print('测试3')
        print(test_else_finally1())
        print('测试4')
        print(test_else_finally2())
        print('测试5')
        print(test_else_return1())
        print('测试6')
        print(test_else_return2())
        print('测试7')
        print(test_else_finally3())

    测试结果:

    ➜  test python3 test_try_finally.py
    测试1
    1
    0
    0
    测试2
    1
    0
    1
    测试3
    1
    0
    1
    测试4
    1
    0
    0
    测试5
    1
    1
    测试6
    1
    3
    3
    测试7
    1
    3
    0
    0

    自己的总结:

    不要在try else里写返回值。如果没有finally,就写在最后,或者只写在finally里。

    try except else里都是做某事   而不是处理返回

  • 相关阅读:
    针对wamp的phpmyadmin显示#2003无法连接mysql
    vs2019编译gdal3.1.0报错 (filemanager.obj) : error LNK2001: 无法解析的外部符号 __imp_SHGetFolderPathW
    半透明遮罩层覆盖整个可视区域
    css首字下沉
    仿花瓣标题栏始终在页面顶部(ie6下position:fixed失效解决方法)
    Redis最佳实践及核心原理
    Java对接微信公众号模板消息推送
    XXLJOB任务调度
    MyBatis学习笔记
    SpringBoot集成Redis
  • 原文地址:https://www.cnblogs.com/xuanmanstein/p/8080629.html
Copyright © 2011-2022 走看看