python try except finally 中带return的执行顺序

def fun():
    i = 0
    try:
        i = i + 1    #i=1
        print "try"
        raise
        return i
        
    except Exception as error:
        print 'exception'
        i+=1
        return i
    else:
        print 'else'
        i+=1
        return i
    finally:
        print 'finally'
        i+=1
        #return i
    print "xxxx"   #return后的语句不会执行

if __name__ == '__main__':
    print fun()

通常return表示函数的返回值,执行return后,函数也就终止了,后边的语句不会再执行
但在try except finally中顺序有点特殊
1.不管怎样,finally代码总会执行
2.try except finally语句的return是暂存起来,执行到return时,并没有直接返回`

.......忽略开头结尾
i=0
try:
	   i = i + 1    #i=1
	   print ("try")
	   raise
	   return i   #出现异常后不执行
        
except Exception as error:
       print ('exception:')
       i+=1    #出现异常后执行到这i=2
       return i
finally:
        print ('finally')
        i+=1
        return i
   		print ("xxxx")   #return后的语句不会执行
.......

上述执行完后:
try
exception: No active exception to reraise
finally
3
可以看出前面出现异常后except里的return没有直接返回2,而是执行finally后return 3

3.当try中没有异常抛出,且有return时,

a)当return的变量是不可变类型,且finally中没有return时,那么不管finally中语句块是否有改变return的值,都不会改变返回值

i=0
try:
	   i = i + 1    #i=1
	   print ("try")
	   return i   
except Exception as error:
       print ('exception:')
       i+=1    #出现异常后执行到这i=2
       return i
finally:
        print ('finally')
        i+=1
   		print ("xxxx")   #return后的语句不会执行

即上边执行结果为
try
finally
1
b)当return的变量是不可变对象,而finally中有return语句,那么finally中的return会覆盖前面的return

i=0
try:
	   i = i + 1    #i=1
	   print ("try")
	   return i     #i=1
except Exception as error:
       print ('exception:')
       i+=1    #出现异常后执行到这i=2
       return i
finally:
        print ('finally')
        i+=1
        return i
   		print ("xxxx")   #return后的语句不会执行

即上边结果
try
finally
2

c)当return的变量是可变对象,且finally中没有return语句,那么在finally中语句块中如果改变了return的那个对象,return值将会发生改变。(比如前面返回的是一个列表)
4.当try语句块中有异常抛出,且except代码模块中有return时,与第3中情况一样

作者:llicety
链接:https://www.jianshu.com/p/5cf04a868032
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

猜你喜欢

转载自blog.csdn.net/weixin_44897787/article/details/89353388