溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

Python基礎(chǔ)學(xué)習(xí)教程系列講解——try_except異常處理機(jī)制

發(fā)布時(shí)間:2020-08-06 18:13:18 來(lái)源:ITPUB博客 閱讀:174 作者:千鋒Python唐小強(qiáng) 欄目:編程語(yǔ)言

在Python編程中不可避免的會(huì)出現(xiàn)錯(cuò)誤,在調(diào)試階段出現(xiàn)語(yǔ)法之類(lèi)的錯(cuò)誤時(shí),Pycharm會(huì)在Debug窗口提示錯(cuò)誤,但是程序在運(yùn)行時(shí)由于內(nèi)部隱含的問(wèn)題而引起錯(cuò)誤,會(huì)導(dǎo)致程序終止執(zhí)行。比如以下例程中,使用urllib庫(kù)打開(kāi)URL時(shí)由于網(wǎng)絡(luò)問(wèn)題而發(fā)生了錯(cuò)誤:

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)解釋器無(wú)法正常處理的程序時(shí)會(huì)引發(fā)異常。如果要避免程序在異常發(fā)生時(shí)結(jié)束運(yùn)行,那么通常使用異常處理語(yǔ)句捕捉異常,再通過(guò)其他的邏輯代碼讓程序繼續(xù)運(yùn)行。異常處理語(yǔ)句為try/except,它的基本語(yǔ)法結(jié)構(gòu)如下:

try:
 < 語(yǔ)句 > # 運(yùn)行代碼
except [(Error1, Error2, ...)[as e]]:
 < 語(yǔ)句 > # 如果在try中引發(fā)了'Error1'異常
except [(Error3, Error4, ...)[as e]]:
 < 語(yǔ)句 > # 如果在try中引發(fā)了'Error3'異常
except:
 < 語(yǔ)句 > # 如果在try中引發(fā)了其他異常

當(dāng)Python 解釋器在執(zhí)行 try 中的代碼時(shí)出現(xiàn)異常,Python 解釋器會(huì)依次判斷該異常對(duì)象是否是 except 塊后的異常類(lèi)或其子類(lèi)的實(shí)例,根據(jù)該異常的類(lèi)型尋找能處理該異常對(duì)象的 except 塊,如果找到合適的 except 塊,則把該異常對(duì)象交給該 except 塊處理。如果 Python 解釋器找不到捕獲異常的 except 塊,則程序運(yùn)行終止,Python 解釋器也將退出。

從 try except 的基本語(yǔ)法格式可以看出,try 塊僅有一個(gè),但 except 代碼塊可以有多個(gè),這是為了針對(duì)不同的異常類(lèi)型提供不同的異常處理方式,比如以下例程中,分別定義了浮點(diǎn)計(jì)算錯(cuò)誤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")

以上程序針對(duì) FloatingPointError、IOError類(lèi)型的異常,提供了專(zhuān)門(mén)的異常處理邏輯。該程序運(yùn)行時(shí)的異常處理邏輯可能有如下幾種情形:

  • 如果在運(yùn)行該程序時(shí)出現(xiàn)浮點(diǎn)計(jì)算錯(cuò)誤,Python 將調(diào)用 FloatingPointError 對(duì)應(yīng)的 except 塊處理該異常。
  • 如果在運(yùn)行該程序時(shí)出現(xiàn)輸入/輸出操作失敗,Python 將調(diào)用IOError對(duì)應(yīng)的 except 塊處理該異常。此處解釋器會(huì)執(zhí)行IOError的異常處理。
  • 如果在程序運(yùn)行時(shí)出現(xiàn)其他異常,Python 可以調(diào)用 Exception 對(duì)應(yīng)的 except 塊處理該異常。當(dāng)然except后面也可以不指定任何異常類(lèi)。

在語(yǔ)法中的[]內(nèi)為可選內(nèi)容,于是可以有以下幾種形式:

1 . except 后不指定具體的異常名稱(chēng),表示要捕獲所有類(lèi)型的異常。

try:
 < 語(yǔ)句 > # 運(yùn)行代碼
except:
 < 語(yǔ)句 > # 如果在try中引發(fā)了其他異常

2 . except 后指定具體的異常名稱(chēng),表示捕獲指定類(lèi)型的異常。比如 Error1、Error2、Error3、Error4分別表示各自的 except 塊可以處理異常的具體類(lèi)型。

try:
 <語(yǔ)句> # 運(yùn)行代碼
except Error1:
 <語(yǔ)句> # 如果在try中引發(fā)了'Error1'異常

3 . [as e] 表示將異常類(lèi)型賦值給變量 e,以方于在 except 塊中調(diào)用異常類(lèi)型。所有的異常對(duì)象都包含了如下幾個(gè)常用屬性和方法:

args:該屬性返回異常的錯(cuò)誤編號(hào)和描述字符串。

errno:該屬性返回異常的錯(cuò)誤編號(hào)。

strerror:該屬性返回異常的描述字符串。

with_traceback():通過(guò)該方法可處理異常的傳播軌跡信息。

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) # 訪問(wèn)異常的錯(cuò)誤編號(hào)和詳細(xì)信息
 print(e.errno) # 訪問(wèn)異常的錯(cuò)誤編號(hào)
 print(e.strerror) # 訪問(wèn)異常的詳細(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ù)直接寫(xiě)入到一個(gè)文件。比如:

traceback.print_exc(file=open('except.txt', 'w+')) # 寫(xiě)入到except.txt文件去

以下為Python部分標(biāo)準(zhǔn)異常類(lèi):

Python基礎(chǔ)學(xué)習(xí)教程系列講解——try_except異常處理機(jī)制
向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI