盤點URLError和HTTPError異常處理方式
回復(fù)“ 書籍 ”即可獲贈Python從入門到進階共10本電子書
今
日
雞
湯
不堪玄鬢影,來對白頭吟。一、前言
本文主要說URLError 還有 HTTPError,以及一些處理方式。
二、URLError
1. 解釋下 URLError 可能產(chǎn)生的3個原因:
# 1. 網(wǎng)絡(luò)無連接,即本機無法上網(wǎng)。
# 2. 連接不到特定的服務(wù)器。
# 3. 服務(wù)器不存在。
2. 案例
例:
在代碼中,需要用 try-except 語句來包圍并捕獲相應(yīng)的異常。
# coding:UTF8
import urllib.request
request = urllib.request.urlopen("http://www.baidu.com")
try:urllib.request.urlopen(request)print("[Errno 11004] getaddrinfo failed")except urllib.URLError as e:print(e.reason)
利用了 urlopen 方法訪問了一個不存在的網(wǎng)址。
運行結(jié)果:

注:
它說明了錯誤代號是11004,錯誤原因是 getaddrinfo failed。
三、HTTPError
HTTPError 是 URLError 的子類,在利用 urlopen 方法發(fā)出一個請求時,服務(wù)器上都會對應(yīng)一個應(yīng)答對象 response,其中它包含一個數(shù)字”狀態(tài)碼”。
例:
捕獲的異常是 HTTPError,它會帶有一個 code 屬性,就是錯誤代號,另外又打印了 reason 屬性,這是它的父類 URLError 的屬性。
import urllib2req = urllib2.Request('http://blog.csdn.net/cqcre')try:urllib2.urlopen(req)except urllib2.HTTPError, e:print e.codeprint e.reason
運行結(jié)果:

1. 代碼解析
錯誤代號是 403,錯誤原因是 Forbidden,說明服務(wù)器禁止訪問。
知道,HTTPError 的父類是 URLError,根據(jù)編程經(jīng)驗,父類的異常應(yīng)當(dāng)寫到子類異常的后面,如果子類捕獲不到,那么可以捕獲父類的異常,
2. 優(yōu)化代碼
import urllib2req = urllib2.Request('http://blog.csdn.net/cqcre')try:urllib2.urlopen(req)except urllib2.HTTPError, e:print e.codeexcept urllib2.URLError, e:print e.reasonelse:print "OK"

如果捕獲到了 HTTPError,則輸出 code,不會再處理 URLError 異常。如果發(fā)生的不是HTTPError,則會去捕獲 URLError 異常,輸出錯誤原因。
另外還可以加入 hasattr 屬性提前對屬性進行判斷,代碼改寫如下
import urllib2req = urllib2.Request('http://blog.csdn.net/cqcre')try:urllib2.urlopen(req)except urllib2.URLError, e:if hasattr(e,"code"):print e.codeif hasattr(e,"reason"):print e.reasonelse:print "OK"

3. 異常處理方法
-
首先對異常的屬性進行判斷,以免出現(xiàn)屬性輸出報錯的現(xiàn)象 。
-
假如 response 是一個”重定向”,需定位到別的地址獲取文檔,urllib2 將對此進行處理。
注 :
HTTPError 實例產(chǎn)生后會有一個 code 屬性,這就是是服務(wù)器發(fā)送的相關(guān)錯誤號。
因為 urllib2 可以為處理重定向,也就是 3 開頭的代號可以被處理,并且 100-299 范圍的號碼指示成功,所以只能看到 400-599 的錯誤號碼。
四、總結(jié)
本文基于基礎(chǔ),通過案例的分析,代碼的展示。解決在實際應(yīng)用中,對于URLError空異常的處理方式。介紹了兩種主要的異常錯誤。以及提供了相應(yīng)錯誤的解決方案處理方法。
歡迎大家積極嘗試,有時候看到別人實現(xiàn)起來很簡單,但是到自己動手實現(xiàn)的時候,總會有各種各樣的問題,切勿眼高手低,勤動手,才可以理解的更加深刻。
使用語言,能夠讓讀者更清晰,更直觀的理解文章內(nèi)容。代碼很簡單,希望對學(xué)習(xí)有幫助。
------------------- End -------------------
往期精彩文章推薦:
-
手把手教你利用Python輕松拆分Excel為多個CSV文件
-
Python項目實戰(zhàn)——手把手教你使用Django框架實現(xiàn)支付寶付款
-
手把手教你用Python爬取百度搜索結(jié)果并保存
歡迎大家點贊,留言,轉(zhuǎn)發(fā),轉(zhuǎn)載,感謝大家的相伴與支持
想加入Python學(xué)習(xí)群請在后臺回復(fù)【 入群 】
萬水千山總是情,點個【 在看 】行不行
/今日留言主題/
隨便說一兩句吧~
