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
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。