日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

Python之try except异常处理工作机制和案例解析

發(fā)布時間:2025/3/20 python 53 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python之try except异常处理工作机制和案例解析 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

【說明】我們在寫python程序時往往為了考慮程序的健壯性通常會考慮到程序執(zhí)行過程中遇到什么樣的異常,出現(xiàn)這樣的錯誤代表著什么,我們可以提前捕獲這些個錯誤方便我們進行處理,python在實際應用中通過try與except來實現(xiàn)異常的處理:
python中try/except/else/finally語句的完整格式如下所示:
(ps:測試代碼為Python3.7.4)

try:Normal execution block except A:Exception A handle except B:Exception B handle except:Other exception handle else:if no exception,get here finally:print("finally")

語句邏輯意義:

說明:
正常執(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處理常見異常分類】

  • 單個異常處理
    -語句:
try:statements #處理的語句 except Error1 as e: #遇到Error1執(zhí)行下面的語句,在python2中寫成except Error1,eprint(e)

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)")
  • 處理多個異常
    -語句:
方式1: try:code except Error1 as e: #處理Error1異常print(e) except Error2 as e: #處理Error2異常print(e)方式2: try:code except (Error1,Error2,...) as e:print(e)

注:第二種寫法的用處:括號里面的所有錯誤,不管出現(xiàn)里面任何一種錯誤都用統(tǒng)一的處理方法。
eg2:

name = [1,2,3] data = {"a":"b"} try:data["c"] # 這邊已經出現(xiàn)異常KeyError ,所以直接跳出code,跳到KeyError 下去處理name[3] except IndexError as e:print(e) except KeyError as e:print(e)#輸出 'c'

【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")
  • 無異常情況
try:print("A") #沒有異常 except (IndexError,KeyError) as e:print(e) except Exception as e:print(e) else:print("沒有異常") finally:print("不管有沒有錯,都這行finnally") #輸出 A 沒有異常 不管有沒有錯,都這行finnally
  • 有異常情況
try:data = {"a":"b"}data["c"] #data字典中沒有'c'這個key值 except (IndexError,KeyError) as e:print(e) except Exception as e:print(e) else:print("沒有異常") finally:print("不管有沒有錯,都這行finnally") #輸出 'c' 不管有沒有錯,都這行finnally

【 自定義異常】

  • 定義異常類
class MyError(Exception): #定義一個異常類MyError,繼承Exceptiondef __init__(self,message):self.message = messagedef __str__(self):return self.message #給對象取一個名
  • 觸發(fā)自定義異常
    我們可以使用raise語句自己觸發(fā)異常
    raise語法格式如下:
raise [Exception [, args [, traceback]]]

語句中 Exception 是異常的類型(例如,NameError)參數(shù)標準異常中任一種,args 是自已提供的異常參數(shù)。最后一個參數(shù)是可選的(在實踐中很少使用),如果存在,是跟蹤異常對象。

try:raise MyError("數(shù)據(jù)庫未成功連接") #觸發(fā)自定義異常,MyError("數(shù)據(jù)庫未成功連接")這個對象 except MyError as e:print(e)#輸出 數(shù)據(jù)庫未成功連接

【寫在后面】
說了這么多若果您還沒看太懂那就直接自己試一下這個案例吧

#!/usr/bin/python3 # -*- coding: utf-8 -*- import xlsxwriter import xlrdworkbook = xlsxwriter.Workbook('C:\\Users\\Elink 001\\Desktop\\tabletest.xls') worksheet = workbook.add_worksheet('table') workbook.close()workbook1 = xlrd.open_workbook(r'C:\Users\Elink 001\Desktop\tabletest.xls') sh = workbook1.sheet_by_name('table')rows = sh.row_values(1) # 第2行內容 cols = sh.col_values(0) # 第1列內容 print("cols, rows", cols, rows)# 獲取單元格內容 print(" 第1行第1列數(shù)據(jù)", sh.cell(0, 0).value)
  • 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
#!/usr/bin/python3 # -*- coding: utf-8 -*-import xlsxwriter import xlrd# workbook = xlsxwriter.Workbook('C:\\Users\\Elink 001\\Desktop\\tabletest.xls') # worksheet = workbook.add_worksheet('table') # workbook.close()workbook1 = xlrd.open_workbook(r'C:\Users\Elink 001\Desktop\tabletest.xls') sh = workbook1.sheet_by_name('table')rows = sh.row_values(1) # 第2行內容 cols = sh.col_values(0) # 第1列內容 print("cols, rows", cols, rows)# 獲取單元格內容 print("第1行第1列數(shù)據(jù)", sh.cell(0, 0).value) # 第1行第1列數(shù)據(jù)i = 2 k = 0try:test1 = sh.cell(0, 3).valueif i > 1:k = 1 except IndexError:print("array index out of range")print("第1行第1列數(shù)據(jù)", sh.cell(0, 0).value)j = 2print("j = ", j) print("k = ", k)

實驗結果:

說明:
我認為try-except 的學習好比C語言中的if-else語法結構。即當我們將對于可能出錯的代碼放在try包含的內容中執(zhí)行,如果發(fā)生錯誤,系統(tǒng)制動檢測except中是否有設置好的錯誤分類,如果try執(zhí)行結果的錯誤類型屬于except錯誤類型,則執(zhí)行except塊語句,執(zhí)行完之后再執(zhí)行整個try-except之后的語句塊:
本例中

i = 2 k = 0try:test1 = sh.cell(0, 3).valueif i > 1:k = 1 except IndexError:print("array index out of range")print("第1行第1列數(shù)據(jù)", sh.cell(0, 0).value)j = 2print("j = ", j) print("k = ", k)
  • 當我們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异常处理工作机制和案例解析的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 午夜激情av | 欧美在线免费观看 | 国产毛片一区二区 | 少妇天天干| 国产一区二区三区观看 | 2019日韩中文字幕mv | 久久久噜噜噜www成人网 | 特级西西444www高清大视频 | 成人动漫av在线 | 自拍视频在线 | 国产精品久久一区 | 国产第一页av | 国产激情毛片 | 麻豆性视频| 五月婷婷伊人网 | 国产精品99一区 | 中文在线不卡视频 | av视屏 | 亚洲色图视频在线 | 亚洲成人av在线播放 | 激情av网| 人妻一区二区三区免费 | 日韩欧美在线免费 | 超碰2021| 久久人人爽人人爽人人 | 欧美大色 | 欧美激情久久久 | av网站亚洲| 农村激情伦hxvideos | 高清欧美性猛交xxxx | 亚洲视频一区在线播放 | 亚州a级片 | av观看免费在线 | 超碰资源总站 | 久久精品天天中文字幕人妻 | 国产精品无码久久久久成人app | 秋霞午夜伦理 | 蜜桃av久久久亚洲精品 | 亚洲美女屁股眼交8 | 国产精品久久久久久久久久久久 | 久久影视一区 | av不卡在线 | 91精品国产综合久久久蜜臀九色 | 亚洲av男人的天堂在线观看 | 涩涩视频网| 亚洲精品一区二区三区在线观看 | 欧美人和黑人牲交网站上线 | 国产大尺度视频 | 男人的天堂视频在线观看 | 日韩av一区二区三区 | 好男人网站 | 亚洲在线一区二区三区 | 伊人久久久久久久久久久 | 久草国产在线观看 | 国产又大又长又粗 | 免费毛片一区二区三区 | 天天人人精品 | 特级毛片爽www免费版 | 欧美日韩亚 | 欧美色图五月天 | 假日游船法国满天星 | 国产精品无码一区二区桃花视频 | 国产夫妻性生活视频 | 国产精品白嫩极品美女视频 | 老司机深夜福利在线观看 | 女厕厕露p撒尿八个少妇 | 国产精品三区四区 | 成人午夜淫片免费观看 | 久久精品7| 国产精品日韩欧美 | 国产精品美女久久 | 2020亚洲天堂 | 国产超碰在线观看 | 色狠| 玉女心经在线看 | 最新日韩一区 | 国产精品日本一区二区在线播放 | 日韩精品中文字幕一区二区三区 | 99er精品视频| 四虎永久在线观看 | 青青青国产精品一区二区 | 成人一级视频在线观看 | aaa黄色片| 日本一级大毛片a一 | 不卡精品视频 | 日本a v在线播放 | 成在人线av | 在线免费观看视频 | 不卡在线一区二区 | 日韩亚洲欧美一区二区三区 | 999热| 91网站在线免费看 | 貂蝉被到爽流白浆在线观看 | 日韩一区高清 | 不卡的在线视频 | 国产影视一区二区三区 | 欲色av | 久久夜色精品国产噜噜亚洲av | 国产伦精品一区二区三区视频痴汉 |