在編寫高質(zhì)量代碼-改善python程序的91個(gè)建議中有一個(gè)關(guān)于try-finally的一個(gè)問題如下:
def ReturnTest(a):
try:
if a <= 0:
raise ValueError('data can not be negative')
else:
return a
except ValueError as e:
print(e)
finally:
print('the end')
return -1
ReturnTest(0)
ReturnTest(2)
給入?yún)?shù)為0時(shí),輸出結(jié)果可以解釋通,輸入?yún)?shù)為2時(shí),就想不通了,書中解釋說是在執(zhí)行return a之前會(huì)先執(zhí)行finally代碼塊,這是為何?
3 回答

MMTTMM
TA貢獻(xiàn)1869條經(jīng)驗(yàn) 獲得超4個(gè)贊
這是預(yù)期行為:不管發(fā)生什么,finally 塊總是會(huì)執(zhí)行,即使你 return 也一樣。
PS: 這本書好像是我讀了開頭就因?yàn)橛X得質(zhì)量太差而讀不下去的那本呢。

當(dāng)年話下
TA貢獻(xiàn)1890條經(jīng)驗(yàn) 獲得超9個(gè)贊
try-except里面,當(dāng)執(zhí)行到try
塊中return
語句的時(shí)候,會(huì)自動(dòng)跳轉(zhuǎn)到finally
塊中執(zhí)行,當(dāng)finally
中的執(zhí)行完后,再進(jìn)入try
中執(zhí)行return
, 為此,我做了個(gè)測(cè)試:
def test():
try:
print(666)
return 1
finally:
print(777)
>>> test()
666
777
1
從輸出結(jié)果能看出剛剛的結(jié)論

森林海
TA貢獻(xiàn)2011條經(jīng)驗(yàn) 獲得超2個(gè)贊
這和java是一樣的,finally
加上它,就是必須要做的!
這不是坑,而且語言的設(shè)計(jì),這是語法規(guī)則,就好像python要求縮進(jìn)一樣。
添加回答
舉報(bào)
0/150
提交
取消