Python中異常的捕獲與處理詳解
異常是什么
Python異常是指在程序運(yùn)行中所產(chǎn)生的錯(cuò)誤,即代碼在無法正常執(zhí)行的情況下就會(huì)產(chǎn)生異常。
這個(gè)錯(cuò)誤可以是Python內(nèi)置的錯(cuò)誤類型,也可以是開發(fā)者自定義的錯(cuò)誤類型。
一、異常捕獲的框架
針對(duì)異常捕獲有幾種組合使用,針對(duì)于不同的場(chǎng)景使用不同的方法,在介紹組合使用的方法之前,先說一下異常捕獲的框架
第一種框架:
try: # 此處放你覺得將會(huì)出現(xiàn)異常的代碼,放這里 except 異常類型 as 變量: print(變量)
第二種框架:
這里不寫異常類型和變量,也是可以的,因?yàn)?python 解釋器內(nèi)部有一個(gè)基類(object),就是異常的基類 Exception ,系統(tǒng)會(huì)自動(dòng)根據(jù)你出現(xiàn)的異常類型,去給你打印對(duì)應(yīng)的異常內(nèi)容
try: # 此處放你要可能要出現(xiàn)異常的代碼 except: # except 后面也可以不寫異常類型和變量 print()
異常類型有很多種,例如:
NameError、ZeroDivisionError、list index out of range
- 變量沒有定義出現(xiàn)的異常
- 除數(shù)不能為0的異常
- 使用索引去取值的時(shí)候,超過了索引的范圍的異常
針對(duì)于第一種變量沒有定義的異常,這里我在 pycharm 中直接輸入了一個(gè)字母 a,很顯然,我沒有定義變量 a 然后就去運(yùn)行就報(bào)出了異常
二、try-except 組合
- try-except
- try-except-else
- try-except-finally
第一種組合:try-except
# 當(dāng)變量沒有定義的異常 try: a # try 與 except 之間寫可能會(huì)出現(xiàn)異常的代碼 except NameError as s: # NameError 為異常的類型 print(s)
如下圖輸出的為:異常類型所對(duì)應(yīng)的類型
-當(dāng)除數(shù)不為0的時(shí)候,這里要理解,當(dāng)沒有異常的時(shí)候,只會(huì)執(zhí)行 try 里面你寫的正常的代碼,而不會(huì)去執(zhí)行 except 里面的代碼,所以不必去擔(dān)心,當(dāng)我程序運(yùn)行正常,也會(huì)執(zhí)行 except 里面的代碼,而對(duì)執(zhí)行的結(jié)果有影響
# 當(dāng)除數(shù)不能為0的異常 try: a = 0 b = 9 c = a / b # 當(dāng)沒有異常的時(shí)候,只會(huì)執(zhí)行 try 里面的代碼,而不會(huì)執(zhí)行 except 里面的代碼 print(c) except ZeroDivisionError as zero: print(zero)
上面運(yùn)行的結(jié)果如下圖,輸出了變量 c 的結(jié)果,程序沒有異常,所以就沒有執(zhí)行except
-當(dāng)除數(shù)為0的情況,有異常的時(shí)候
第二種組合:try-except-else
這種組合用的較少
# try-except-else 結(jié)構(gòu),當(dāng)沒有異常的時(shí)候,就會(huì)執(zhí)行 else 里面的代碼 try: a = [1,2,3,4,5] b = a[2] except IndexError as index_a: print(index_a) else: print(b)
輸出的結(jié)果為:3,因?yàn)闆]有異常,所以也就沒有執(zhí)行 except 里面的代碼,也就執(zhí)行了 else
這種其實(shí)就跟我們正常的 try-except 組合很像,只不過這里單獨(dú) 加了一個(gè) else 關(guān)鍵字而已
讓其輸出結(jié)果,沒有什么特別之處
第三種組合:try-except-finally
使用的次數(shù)很多,這里多加了一個(gè)保留字 finally 就是不管是否有異常,都會(huì)執(zhí)行 finally 里面的代碼
使用場(chǎng)景就是我可能在日常寫代碼的時(shí)候,我知道某一個(gè)地方可能會(huì)出現(xiàn)異常,但是我不管里面是否真正的出現(xiàn)異常,我都繼續(xù)執(zhí)行其它的代碼
# try-except-finally 結(jié)構(gòu),不管代碼是否有異常,最后都會(huì)執(zhí)行 finally 里面的代碼 try: a = [1,2,3,4,5] b = a[2] except IndexError as index_b: print(index_b) finally: print("列表索引超出了范圍")
- 沒有異常的時(shí)候,輸出 finally 里面的代碼
- 有異常的時(shí)候
# 1.try-except-finally 結(jié)構(gòu),不管代碼是否有異常,最后都會(huì)執(zhí)行 finally 里面的代碼 # 2.except 后面也可以不寫異常類型,因?yàn)橄到y(tǒng)默認(rèn)認(rèn)為后面的錯(cuò)誤類型是 Exception,這是一個(gè)基類,包含了所有的出錯(cuò)類型 try: a = [1,2,3,4,5] b = a[10] except: print("list index out of range") finally: print("列表取值的索引值超出了范圍")
- 有異常的時(shí)候,也執(zhí)行了 finally 里面的代碼,注意,這里使用的是第二種結(jié)果,也就是一開始所講的,except 后面沒有跟保留字
第四種組合:try-except-except
當(dāng)要寫的代碼中可能要出現(xiàn)兩個(gè)異常的時(shí)候,這里就可以再添加一個(gè) except 保留字
但是,這里只會(huì)執(zhí)行第一個(gè) except 里面的內(nèi)容
如下,當(dāng)除數(shù)為0的異常,我自定了一個(gè)打印內(nèi)容:除數(shù)不能為0,卻沒有執(zhí)行
""" 如下代碼,有兩個(gè)不同類型的異常,1.變量未定義,2.除數(shù)不能為0,這兩處可能會(huì)出現(xiàn)異常 """ try: a b = 0 c = 9 d = c / b # 注意:當(dāng)有多個(gè) except 的時(shí)候,這里只會(huì)執(zhí)行第一個(gè) except 里面的代碼,其余的不會(huì)執(zhí)行,但是這樣不會(huì)標(biāo)紅 except NameError as name: # 第一種寫法,except 后面跟異常的類型 print(name) except: # 第二種寫法,except 后面不跟異常類型,讓其使用默認(rèn)的 Exception 類,這是一個(gè)基類,包含了所有的出錯(cuò)類型 print("除數(shù)不能為0")
執(zhí)行的結(jié)果如下圖
到此這篇關(guān)于Python中異常的捕獲與處理詳解的文章就介紹到這了,更多相關(guān)Python異常捕獲處理內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python3.8官網(wǎng)文檔之類的基礎(chǔ)語法閱讀
類提供了一種組合數(shù)據(jù)和功能的方法,今天通過本文給大家分享Python3.8官網(wǎng)文檔之類的基礎(chǔ)語法閱讀知識(shí),感興趣的朋友跟隨小編一起看看吧2021-09-09Django搭建項(xiàng)目實(shí)戰(zhàn)與避坑細(xì)節(jié)詳解
這篇文章主要給大家介紹了關(guān)于Django搭建項(xiàng)目實(shí)戰(zhàn)與避坑細(xì)節(jié)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12解決pycharm編輯區(qū)顯示yaml文件層級(jí)結(jié)構(gòu)遇中文亂碼問題
這篇文章主要介紹了解決pycharm編輯區(qū)顯示yaml文件層級(jí)結(jié)構(gòu)遇中文亂碼問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-04-04Python異常信息的不同展現(xiàn)方法總結(jié)
在日常開發(fā)的過程中,當(dāng)代碼報(bào)錯(cuò)時(shí),我們通常要不斷打印、閱讀traceback提示信息,來調(diào)試代碼,這篇文章介紹了如何實(shí)現(xiàn)一個(gè)Exception?Hooks,使得traceback模塊的提示信息更加精確;同時(shí)還介紹了一些第三方庫,這些庫也提供了Exception?Hooks的功能2022-11-11Python?opencv圖像膨脹與腐蝕處理實(shí)例探究
這篇文章主要介紹了Python?opencv圖像膨脹與腐蝕處理實(shí)例探究2024-01-01Ubuntu16.04 安裝多個(gè)python版本的問題及解決方法
Ubuntu16.04自帶python2.7與python3.5,Ubuntu 官方 apt 庫中還未收錄 python 3.8,因此添加 deadsnakes PPA 源安裝python3.8,否則會(huì)出現(xiàn)報(bào)錯(cuò),接下來通過本文給大家介紹Ubuntu16.04 安裝python的問題,一起看看吧2021-09-09Python3中多線程編程的隊(duì)列運(yùn)作示例
這篇文章主要介紹了Python3中多線程編程的隊(duì)列運(yùn)作示例,文中用一個(gè)簡(jiǎn)單的例子展示了Python下嘗試多線程時(shí)隊(duì)列的進(jìn)站出站是如何運(yùn)作的,需要的朋友可以參考下2015-04-04