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