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的执行。
“如果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里都是做某事 而不是处理返回
—————————————