【Python3】避免finally中克能发生的陷阱

1. finally中的陷阱

无论try语句中是否有异常抛出,finally语句总会被执行。由于这个特性,finally语句经常被用来做一些清理工作,如打开一个文件,抛出异常后在finally语句中对文件句柄进行关闭等

 

但使用finally时候,要特别小心一些陷阱,在下就是大意了。先看一个例子:

#!/usr/bin/env python
# -*- coding:utf-8 -*-
__author__ = 'wshu'
def func_test(n):
try:
if n <= 0:
return n
else:
raise ValueError('input value \'n\' not lt 0')
except Exception:
print('try except error.')
return '2'
finally:
print('finally execute end.')
return '-1'

if __name__ == '__main__':
print(func_test(0))
print(func_test(2))
 

思考一下这里程序func_test(0),func_test(2) 的返回值是什么?答案是:“-1”“-1”

 

对于第一个调用func_test(0)在抛出ValueError异常后直接执行finally语句返回值为-1,这点比较容易理解,那么对于第二个调用func_test(2)为什么也返回-1呢?

 

这是因为a>0,会执行else分支,但是由于存在finally语句,在执行else语句的return n 语句之前会先执行finally中的语句,此时由于finally语句中有return -1 程序直接返回了,所以永远不会返回n

 

此为使用finally语句需要注意的第二个陷阱。在实际的应用程序开发过程中,并不推荐在finally中使用return语句进行返回

 

这种处理方式不仅会带来误解而且可能会引起非常严重的错误。

你可能感兴趣的:(【Python3】避免finally中克能发生的陷阱)