Python之try except异常处理工作机制和案例解析
【說明】我們在寫python程序時往往為了考慮程序的健壯性通常會考慮到程序執(zhí)行過程中遇到什么樣的異常,出現(xiàn)這樣的錯誤代表著什么,我們可以提前捕獲這些個錯誤方便我們進行處理,python在實際應用中通過try與except來實現(xiàn)異常的處理:
python中try/except/else/finally語句的完整格式如下所示:
(ps:測試代碼為Python3.7.4)
語句邏輯意義:
說明:
正常執(zhí)行的程序在try下面的Normal execution block執(zhí)行塊中執(zhí)行,在執(zhí)行過程中如果發(fā)生了異常,則中斷當前在Normal execution block中的執(zhí)行跳轉到對應的異常處理塊中開始執(zhí)行;
python從第一個except X處開始查找:
如果找到了對應的exception類型則進入其提供的exception handle中進行處理,
如果沒有找到則直接進入except塊處進行處理。
except塊是可選項,如果沒有提供,該exception將會被提交給python進行默認處理,處理方式則是終止應用程序并打印提示信息;
如果在Normal execution block執(zhí)行塊中執(zhí)行過程中沒有發(fā)生任何異常,則在執(zhí)行完Normal execution block后會進入else執(zhí)行塊中(如果存在的話)執(zhí)行。
無論是否發(fā)生了異常,只要提供了finally語句,以上try/except/else/finally代碼塊執(zhí)行的最后一步總是執(zhí)行finally所對應的代碼塊。
ATTENTION PLEASE:
1.在上面所示的完整語句中try/except/else/finally所出現(xiàn)的順序必須是try–>except X–>except–>else–>finally,即所有的except必須在else和finally之前,else(如果有的話)必須在finally之前,而except X必須在except之前。否則會出現(xiàn)語法錯誤。
2.對于上面所展示的try/except完整格式而言,else和finally都是可選的,而不是必須的,但是如果存在的話else必須在finally之前,finally(如果存在的話)必須在整個語句的最后位置。
3.在上面的完整語句中,else語句的存在必須以except X或者except語句為前提,如果在沒有except語句的try block中使用else語句會引發(fā)語法錯誤。也就是說else不能與try/finally配合使用。
【try-except處理常見異常分類】
- 單個異常處理
-語句:
eg1:
try:db = pyodbc.connect(r'DRIVER={SQL Server Native Client 10.0};'r'SERVER=(local);'r'DATABASE=test;UID=ssa;PWD=726803') except pyodbc.InterfaceError as err: #抓取pyodbc.InterfaceError這個異常大類中的錯誤信息種類并打印print(err)#err是錯誤的詳細信息 #輸出 ('28000', "[28000] [Microsoft][SQL Server Native Client 10.0][SQL Server]用戶 'ssa' 登錄失敗。 (18456) (SQLDriverConnect); [28000] [Microsoft][SQL Server Native Client 10.0][SQL Server]用戶 'ssa' 登錄失敗。 (18456)")- 處理多個異常
-語句:
注:第二種寫法的用處:括號里面的所有錯誤,不管出現(xiàn)里面任何一種錯誤都用統(tǒng)一的處理方法。
eg2:
【Exception實現(xiàn)所有異常處理】
-語句:
try:code except (Error1,Error2,...) as e:print(e) except Exception as e: print(e)# 說明 用Exception表示一下子抓住所有異常,這個一般情況下建議在異常最后面用,用在最后抓未知的異常eg3:
try:open("qigao.text","r",encoding="utf-8") except (IndexError,KeyError) as e: #沒有IndexError,KeyError這兩個異常print(e) except Exception as e: print(e)# 沒有IndexError,KeyError這兩個異常只能通過 Exception 這個異常處理,來抓住所有的異常 #輸出 [Errno 2] No such file or directory: 'qigao.text'【else沒有異常發(fā)生,執(zhí)行else部分的codes】
try:print("A") #代碼沒有異常 except (IndexError,KeyError) as e:print(e) except Exception as e:print(e) else: #沒有異常出錯,走else的邏輯代碼print("沒有異常")#輸出 A 沒有異常【finnally最后執(zhí)行】
try:code except (Error1,Error2,...) as e:print(e) except Exception as e:print(e) else:print("沒有錯誤,執(zhí)行") finnally:print("不管有沒有錯,都執(zhí)行finnally")- 無異常情況
- 有異常情況
【 自定義異常】
- 定義異常類
- 觸發(fā)自定義異常
我們可以使用raise語句自己觸發(fā)異常
raise語法格式如下:
語句中 Exception 是異常的類型(例如,NameError)參數(shù)標準異常中任一種,args 是自已提供的異常參數(shù)。最后一個參數(shù)是可選的(在實踐中很少使用),如果存在,是跟蹤異常對象。
try:raise MyError("數(shù)據(jù)庫未成功連接") #觸發(fā)自定義異常,MyError("數(shù)據(jù)庫未成功連接")這個對象 except MyError as e:print(e)#輸出 數(shù)據(jù)庫未成功連接【寫在后面】
說了這么多若果您還沒看太懂那就直接自己試一下這個案例吧
- step1:當我們執(zhí)行以上代碼后會生成一個表格
手動添加以下數(shù)據(jù):(1列3行,python默認row索引為0-2,col索引為0)
在上述代碼后添加一行:
print(" 第4行第1列數(shù)據(jù)", sh.cell(3, 0).value) #(顯然這個cell的數(shù)據(jù)并不存在)
執(zhí)行后Python提示:
IndexError: list index out of range
- step2.加入try-except
實驗結果:
說明:
我認為try-except 的學習好比C語言中的if-else語法結構。即當我們將對于可能出錯的代碼放在try包含的內容中執(zhí)行,如果發(fā)生錯誤,系統(tǒng)制動檢測except中是否有設置好的錯誤分類,如果try執(zhí)行結果的錯誤類型屬于except錯誤類型,則執(zhí)行except塊語句,執(zhí)行完之后再執(zhí)行整個try-except之后的語句塊:
本例中
- 當我們code執(zhí)行到try:之后檢測到 sh.cell(0, 3).value值并不存在, (k = 1沒有執(zhí)行,k仍然保持k = 0)
- code自動跳轉到except中,
- except包含的錯誤類“IndexError”剛好包含try語句執(zhí)行的錯誤類型“IndexError:list index out of range”,
- 所以執(zhí)行except中的兩個print語句,并對K重新賦值為2
- 接著執(zhí)行try-except之后的語句
對于此處try-except的學習分享有任何不準確的地方希望大家多多交流,謝謝!
總結
以上是生活随笔為你收集整理的Python之try except异常处理工作机制和案例解析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python 与 SQLServer数据
- 下一篇: linux系统之centos/ubunt