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