在Python編程中不可避免的會出現(xiàn)錯誤,在調(diào)試階段出現(xiàn)語法之類的錯誤時,Pycharm會在Debug窗口提示錯誤,但是程序在運(yùn)行時由于內(nèi)部隱含的問題而引起錯誤,會導(dǎo)致程序終止執(zhí)行。比如以下例程中,使用urllib庫打開URL時由于網(wǎng)絡(luò)問題而發(fā)生了錯誤:
成都創(chuàng)新互聯(lián)公司是一家集網(wǎng)站建設(shè),圖們企業(yè)網(wǎng)站建設(shè),圖們品牌網(wǎng)站建設(shè),網(wǎng)站定制,圖們網(wǎng)站建設(shè)報價,網(wǎng)絡(luò)營銷,網(wǎng)絡(luò)優(yōu)化,圖們網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競爭力。可充分滿足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時我們時刻保持專業(yè)、時尚、前沿,時刻以成就客戶成長自我,堅持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實用型網(wǎng)站。import urllib.request req = urllib.request.urlopen('http://www.baidu.com') print(req.read()) Traceback (most recent call last): …… TimeoutError: [WinError 10060] A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond
在Python中出現(xiàn)解釋器無法正常處理的程序時會引發(fā)異常。如果要避免程序在異常發(fā)生時結(jié)束運(yùn)行,那么通常使用異常處理語句捕捉異常,再通過其他的邏輯代碼讓程序繼續(xù)運(yùn)行。異常處理語句為try/except,它的基本語法結(jié)構(gòu)如下:
try: < 語句 > # 運(yùn)行代碼 except [(Error1, Error2, ...)[as e]]: < 語句 > # 如果在try中引發(fā)了'Error1'異常 except [(Error3, Error4, ...)[as e]]: < 語句 > # 如果在try中引發(fā)了'Error3'異常 except: < 語句 > # 如果在try中引發(fā)了其他異常
當(dāng)Python 解釋器在執(zhí)行 try 中的代碼時出現(xiàn)異常,Python 解釋器會依次判斷該異常對象是否是 except 塊后的異常類或其子類的實例,根據(jù)該異常的類型尋找能處理該異常對象的 except 塊,如果找到合適的 except 塊,則把該異常對象交給該 except 塊處理。如果 Python 解釋器找不到捕獲異常的 except 塊,則程序運(yùn)行終止,Python 解釋器也將退出。
從 try except 的基本語法格式可以看出,try 塊僅有一個,但 except 代碼塊可以有多個,這是為了針對不同的異常類型提供不同的異常處理方式,比如以下例程中,分別定義了浮點(diǎn)計算錯誤FloatingPointError異常和輸入/輸出操作失敗IOError異常:
try: import urllib.request req = urllib.request.urlopen('http://www.baidu.com') print(req.read()) except FloatingPointError: print("Capture FloatingPointError") except IOError: print("Capture IOError") except Exception: print("Capture Error") except: print("Capture Error")
以上程序針對 FloatingPointError、IOError類型的異常,提供了專門的異常處理邏輯。該程序運(yùn)行時的異常處理邏輯可能有如下幾種情形:
在語法中的[]內(nèi)為可選內(nèi)容,于是可以有以下幾種形式:
1 . except 后不指定具體的異常名稱,表示要捕獲所有類型的異常。
try: < 語句 > # 運(yùn)行代碼 except: < 語句 > # 如果在try中引發(fā)了其他異常
2 . except 后指定具體的異常名稱,表示捕獲指定類型的異常。比如 Error1、Error2、Error3、Error4分別表示各自的 except 塊可以處理異常的具體類型。
try: <語句> # 運(yùn)行代碼 except Error1: <語句> # 如果在try中引發(fā)了'Error1'異常
3 . [as e] 表示將異常類型賦值給變量 e,以方于在 except 塊中調(diào)用異常類型。所有的異常對象都包含了如下幾個常用屬性和方法:
args:該屬性返回異常的錯誤編號和描述字符串。
errno:該屬性返回異常的錯誤編號。
strerror:該屬性返回異常的描述字符串。
with_traceback():通過該方法可處理異常的傳播軌跡信息。
try: import urllib.request req = urllib.request.urlopen('http://www.baidu.com') print(req.read()) except FloatingPointError: print("Capture FloatingPointError") except IOError as e: print("Capture IOError") print(e.args) # 訪問異常的錯誤編號和詳細(xì)信息 print(e.errno) # 訪問異常的錯誤編號 print(e.strerror) # 訪問異常的詳細(xì)信息 except: print("Capture Error") (TimeoutError(10060, 'A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond', None, 10060, None),) None None
如果要查看更詳細(xì)的異常信息,可以導(dǎo)入traceback模塊,使用print_exc()打印異常信息。print_exc()還可以接受file參數(shù)直接寫入到一個文件。比如:
traceback.print_exc(file=open('except.txt', 'w+')) # 寫入到except.txt文件去
以下為Python部分標(biāo)準(zhǔn)異常類: