通過實例了解Python異常處理機制底層實現(xiàn)
要了解try except異常處理的用法,簡單來說,當位于 try 塊中的程序執(zhí)行出現(xiàn)異常時,會將該種異常捕獲,同時找到對應(yīng)的 except 塊處理該異常,那么這里就有一個問題,它是如何找到對應(yīng)的 except 塊的呢?
我們知道,一個 try 塊也可以對應(yīng)多個 except 塊,一個 except 塊可以同時處理多種異常。如果我們想使用一個 except 塊處理所有異常,就可以這樣寫:
try: #...except Exception: #...
這種情況下,對于 try 塊中可能出現(xiàn)的任何異常,Python解釋器都會交給僅有的這個 except 塊處理,因為它的參數(shù)是 Exception,表示可以接收任何類型的異常。
注意,對于可以接收任何異常的 except 來說,其后可以跟 Exception,也可以不跟任何參數(shù),但表示的含義都是一樣的。
這里就要詳細介紹一下 Exception。要知道,為了表示程序中可能出現(xiàn)的各種異常,Python 提供了大量的異常類,這些異常類之間有嚴格的繼承關(guān)系,圖 1 顯示了 Python 的常見異常類之間的繼承關(guān)系。
從圖 1 中可以看出,BaseException 是Python 中所有異常類的基類,但對于我們來說,最主要的是Exception 類,因為程序中可能出現(xiàn)的各種異常,都繼承自 Exception。
因此,如果用戶要實現(xiàn)自定義異常,不應(yīng)該繼承 BaseException ,而應(yīng)該繼承 Exception 類。關(guān)于如何自定義一個異常類,可閱讀《Python自定義異常類》一節(jié)。
當 try 塊捕獲到異常對象后,Python 解釋器會拿這個異常類型依次和各個 except 塊指定的異常類進行比較,如果捕獲到的這個異常類,和某個 except 塊后的異常類一樣,又或者是該異常類的子類,那么 Python 解釋器就會調(diào)用這個 except 塊來處理異常;反之,Python 解釋器會繼續(xù)比較,直到和最后一個 except 比較完,如果沒有比對成功,則證明該異常無法處理。
圖 2 演示了位于 try 塊中的程序發(fā)生異常時,從捕獲異常到處理異常的整個流程。
下面看幾個簡單的異常捕獲的例子:
try: a = int(input("輸入 a:")) b = int(input("輸入 b:")) print( a/b ) except ValueError: print("數(shù)值錯誤:程序只能接收整數(shù)參數(shù)") except ArithmeticError: print("算術(shù)錯誤") except Exception: print("未知異常")
該程序中,根據(jù)用戶輸入 a 和 b 值的不同,可能會導(dǎo)致 ValueError、ArithmeticError 異常:
- 如果用戶輸入的 a 或者 b 是其他字符,而不是數(shù)字,會發(fā)生 ValueError 異常,try 塊會捕獲到該類型異常,同時 Python 解釋器會調(diào)用第一個 except 塊處理異常;
- 如果用戶輸入的 a 和 b 是數(shù)字,但 b 的值為 0,由于在進行除法運算時除數(shù)不能為 0,因此會發(fā)生 ArithmeticError 異常,try 塊會捕獲該異常,同時 Python 解釋器會調(diào)用第二個 except 塊處理異常;
- 當然,程序運行過程中,還可能由于其他因素出現(xiàn)異常,try 塊都可以捕獲,同時 Python 會調(diào)用最后一個 except 塊來處理。
當一個 try 塊配有多個 except 塊時,這些 except 塊應(yīng)遵循這樣一個排序規(guī)則,即可處理全部異常的 except 塊(參數(shù)為 Exception,也可以什么都不寫)要放到所有 except 塊的后面,且所有父類異常的 except 塊要放到子類異常的 except 塊的后面。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Python實現(xiàn)批量采集商品數(shù)據(jù)的示例詳解
這篇文章主要為大家詳細介紹了如何利用Python實現(xiàn)批量采集商品的數(shù)據(jù),文中的示例代碼講解詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-03-03詳解pandas使用drop_duplicates去除DataFrame重復(fù)項參數(shù)
這篇文章主要介紹了詳解pandas使用drop_duplicates去除DataFrame重復(fù)項參數(shù),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08python實現(xiàn)字符串連接的三種方法及其效率、適用場景詳解
本篇文章主要介紹了python實現(xiàn)字符串連接的三種方法及其效率、適用場景詳解,具有一定的參考價值,感興趣的小伙伴們可以參考一下。2017-01-01Python調(diào)用高德API實現(xiàn)批量地址轉(zhuǎn)經(jīng)緯度并寫入表格的功能
這篇文章主要介紹了Python調(diào)用高德API實現(xiàn)批量地址轉(zhuǎn)經(jīng)緯度并寫入表格的功能,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-01-01django應(yīng)用JWT(JSON?Web?Token)實戰(zhàn)教程
在前后端分離的項目中,JWT(JSON?Web?Token)作為一種廣泛使用的身份驗證和授權(quán)機制,提供了一種安全、高效的方式來保護RESTful?API,本文詳細介紹了JWT的概念、優(yōu)勢、在Django中的應(yīng)用步驟和使用方法,是構(gòu)建安全、高效Web應(yīng)用的有效指南2024-10-10使用python監(jiān)測網(wǎng)絡(luò)連接和網(wǎng)速的實現(xiàn)代碼
在我們?nèi)粘I钪芯W(wǎng)絡(luò)連接和網(wǎng)速在工作中非常重要,本文將介紹如何使用Python程序來監(jiān)測互聯(lián)網(wǎng)連接的速度和中斷情況,并通過代碼示例講解的非常詳細,需要的朋友可以參考下2024-03-03