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里都是做某事   而不是处理返回

  • 相关阅读:
    leetcode 29-> Divide Two Integers without using multiplication, division and mod operator
    ros topic 发布一次可能会接收不到数据
    python中的print()、str()和repr()的区别
    python 部分函数
    uiautomatorviewer错误 unable toconnect to adb
    pyqt 不规则形状窗口显示
    appium 计算器demo
    Spring 3.0 注解注入详解
    Spring Autowire自动装配
    restful 学习地址
  • 原文地址:https://www.cnblogs.com/xuanmanstein/p/8080629.html
Copyright © 2011-2022 走看看