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陳述句進行回傳
這種處理方式不僅會帶來誤解而且可能會引起非常嚴重的錯誤,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/65164.html
標籤:Python
