Python異常處理中容易犯得錯(cuò)誤總結(jié)
Python異常處理機(jī)制

如果try異常處理中存在finally,finally中的代碼總會(huì)得到執(zhí)行
下面例子只是作為演示,不用去糾結(jié)業(yè)務(wù)邏輯
容易犯的錯(cuò)誤1
看下面的代碼,寫(xiě)出輸出結(jié)果
def dig_dig1():
while True:
print("I'm in while loop")
try:
print("I'm in try")
raise EOFError
except IOError:
print("IOEoor")
finally:
print("I'm in finally")
break
dig_dig1()
原以為會(huì)輸出的結(jié)果:
I'm in while loop I'm in try I'm in finally EOFError Process finished with exit code 1
運(yùn)行結(jié)果
I'm in while loop I'm in try I'm in finally Process finished with exit code 0
- 如果異常處理中存在finally, finally總會(huì)被執(zhí)行;
- 那么在執(zhí)行finally之前,try中的產(chǎn)生的異常將會(huì)被臨時(shí)保存起來(lái),當(dāng)finally的代碼執(zhí)行完成后,再拋出異常;
- 但當(dāng)finally中存在raise或return或break時(shí), try中的異常將會(huì)被拋棄。
容易犯的錯(cuò)誤2
看下面的代碼,寫(xiě)出輸出結(jié)果
def dig_dig2(index):
try:
print("I'm in try")
if index < 0:
raise IndexError
else:
return index
except IndexError:
print("I'm in except")
return "except"
finally:
print("I'm in finally")
return "finally"
print(dig_dig2(12))
原以為會(huì)輸出的結(jié)果:
I'm in try 12
運(yùn)行結(jié)果
I'm in try I'm in finally finally Process finished with exit code 0
- 如果異常處理中存在finally, finally總會(huì)被執(zhí)行。
- 如果在try塊語(yǔ)句中存在return的同時(shí)又存在finally塊語(yǔ)句,那么將會(huì)在執(zhí)行try塊語(yǔ)句中return語(yǔ)句之前去執(zhí)行finally語(yǔ)句塊,然后再回來(lái)執(zhí)行try塊語(yǔ)句中return語(yǔ)句。
- 但是例子中在finally塊語(yǔ)句中存在return語(yǔ)句,整個(gè)函數(shù)已結(jié)束,所以try塊語(yǔ)句中return語(yǔ)句將永遠(yuǎn)得不到執(zhí)行。
總結(jié)
一般情況下,如果異常處理中存在finally, finally總會(huì)被執(zhí)行。但是,存在以下情況就需要注意:
- 在執(zhí)行finally之前,try中的產(chǎn)生的異常將會(huì)被臨時(shí)保存起來(lái),當(dāng)finally的代碼執(zhí)行完成后,再拋出異常; 但當(dāng)finally中存在raise或return或break時(shí), try中的異常將會(huì)被拋棄。
- 如果在try塊語(yǔ)句中存在return的同時(shí)又存在finally塊語(yǔ)句,那么將會(huì)在執(zhí)行try塊語(yǔ)句中return語(yǔ)句之前去執(zhí)行finally語(yǔ)句塊,然后再回來(lái)執(zhí)行try塊語(yǔ)句中return語(yǔ)句。但是在finally塊語(yǔ)句中存在return語(yǔ)句,整個(gè)函數(shù)已結(jié)束,所以try塊語(yǔ)句中return語(yǔ)句將永遠(yuǎn)得不到執(zhí)行。
以上就是Python異常處理中容易犯得錯(cuò)誤總結(jié)的詳細(xì)內(nèi)容,更多關(guān)于python 異常處理的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
python3通過(guò)udp實(shí)現(xiàn)組播數(shù)據(jù)的發(fā)送和接收操作
這篇文章主要介紹了python3通過(guò)udp實(shí)現(xiàn)組播數(shù)據(jù)的發(fā)送和接收操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-05-05
python腳本實(shí)現(xiàn)xls(xlsx)轉(zhuǎn)成csv
這篇文章主要介紹了python腳本實(shí)現(xiàn)xls(xlsx)轉(zhuǎn)成csv的相關(guān)資料,需要的朋友可以參考下2016-04-04
python實(shí)現(xiàn)批量圖片格式轉(zhuǎn)換
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)批量圖片格式轉(zhuǎn)換的方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-06-06
python統(tǒng)計(jì)指定目錄內(nèi)文件的代碼行數(shù)
這篇文章主要介紹了python統(tǒng)計(jì)指定目錄內(nèi)文件的代碼行數(shù)2019-09-09

