Python異常處理中容易犯得錯(cuò)誤總結(jié)
Python異常處理機(jī)制
如果try異常處理中存在finally,finally中的代碼總會得到執(zhí)行
下面例子只是作為演示,不用去糾結(jié)業(yè)務(wù)邏輯
容易犯的錯(cuò)誤1
看下面的代碼,寫出輸出結(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()
原以為會輸出的結(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總會被執(zhí)行;
- 那么在執(zhí)行finally之前,try中的產(chǎn)生的異常將會被臨時(shí)保存起來,當(dāng)finally的代碼執(zhí)行完成后,再拋出異常;
- 但當(dāng)finally中存在raise或return或break時(shí), try中的異常將會被拋棄。
容易犯的錯(cuò)誤2
看下面的代碼,寫出輸出結(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))
原以為會輸出的結(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總會被執(zhí)行。
- 如果在try塊語句中存在return的同時(shí)又存在finally塊語句,那么將會在執(zhí)行try塊語句中return語句之前去執(zhí)行finally語句塊,然后再回來執(zhí)行try塊語句中return語句。
- 但是例子中在finally塊語句中存在return語句,整個(gè)函數(shù)已結(jié)束,所以try塊語句中return語句將永遠(yuǎn)得不到執(zhí)行。
總結(jié)
一般情況下,如果異常處理中存在finally, finally總會被執(zhí)行。但是,存在以下情況就需要注意:
- 在執(zhí)行finally之前,try中的產(chǎn)生的異常將會被臨時(shí)保存起來,當(dāng)finally的代碼執(zhí)行完成后,再拋出異常; 但當(dāng)finally中存在raise或return或break時(shí), try中的異常將會被拋棄。
- 如果在try塊語句中存在return的同時(shí)又存在finally塊語句,那么將會在執(zhí)行try塊語句中return語句之前去執(zhí)行finally語句塊,然后再回來執(zhí)行try塊語句中return語句。但是在finally塊語句中存在return語句,整個(gè)函數(shù)已結(jié)束,所以try塊語句中return語句將永遠(yuǎn)得不到執(zhí)行。
以上就是Python異常處理中容易犯得錯(cuò)誤總結(jié)的詳細(xì)內(nèi)容,更多關(guān)于python 異常處理的資料請關(guān)注本站其它相關(guān)文章!
版權(quán)聲明:本站文章來源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請保持原文完整并注明來源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學(xué)習(xí)參考,不代表本站立場,如有內(nèi)容涉嫌侵權(quán),請聯(lián)系alex-e#qq.com處理。