urllib2 的異常錯(cuò)誤處理
- 在我們用urlopen或opener.open方法發(fā)出一個(gè)請(qǐng)求時(shí),如果urlopen或opener.open不能處理這個(gè)response,就產(chǎn)生錯(cuò)誤。
- 這里主要說的是URLError和HTTPError,以及對(duì)它們的錯(cuò)誤處理。
URLError
- URLError 產(chǎn)生的原因主要有:
- 沒有網(wǎng)絡(luò)連接
- 服務(wù)器連接失敗
- 找不到指定的服務(wù)器
- 我們可以用try except語(yǔ)句來捕獲相應(yīng)的異常。下面的例子里我們?cè)L問了一個(gè)不存在的域名:
# urllib2_urlerror.py
import urllib2
requset = urllib2.Request('http://www.ajkfhafwjqh.com')
try:
urllib2.urlopen(request, timeout=5)
except urllib2.URLError, err:
print err
- 運(yùn)行結(jié)果如下:
<urlopen error [Errno 8] nodename nor servname provided, or not known>
urlopen error,錯(cuò)誤代碼8,錯(cuò)誤原因是沒有找到指定的服務(wù)器。
HTTPError
- HTTPError是URLError的子類,我們發(fā)出一個(gè)請(qǐng)求時(shí),服務(wù)器上都會(huì)對(duì)應(yīng)一個(gè)response應(yīng)答對(duì)象,其中它包含一個(gè)數(shù)字"響應(yīng)狀態(tài)碼"。
- 如果urlopen或opener.open不能處理的,會(huì)產(chǎn)生一個(gè)HTTPError,對(duì)應(yīng)相應(yīng)的狀態(tài)碼,HTTP狀態(tài)碼表示HTTP協(xié)議所返回的響應(yīng)的狀態(tài)。
注意,urllib2可以為我們處理重定向的頁(yè)面(也就是3開頭的響應(yīng)碼),100-299范圍的號(hào)碼表示成功,所以我們只能看到400-599的錯(cuò)誤號(hào)碼。
# urllib2_httperror.py
import urllib2
requset = urllib2.Request('http://blog.baidu.com/itcast')
try:
urllib2.urlopen(requset)
except urllib2.HTTPError, err:
print err.code
print err
- 運(yùn)行結(jié)果如下:
404 HTTP Error 404: Not Found
HTTP Error,錯(cuò)誤代號(hào)是404,錯(cuò)誤原因是Not Found,說明服務(wù)器無法找到被請(qǐng)求的頁(yè)面。
通常產(chǎn)生這種錯(cuò)誤的,要么url不對(duì),要么ip被封。
改進(jìn)版
- 由于HTTPError的父類是URLError,所以父類的異常應(yīng)當(dāng)寫到子類異常的后面,所以上述的代碼可以這么改寫:
# urllib2_botherror.py
import urllib2
requset = urllib2.Request('http://blog.baidu.com/itcast')
try:
urllib2.urlopen(requset)
except urllib2.HTTPError, err:
print err.code
except urllib2.URLError, err:
print err
else:
print "Good Job"
- 運(yùn)行結(jié)果如下:
404 - 這樣我們就可以做到,首先捕獲子類的異常,如果子類捕獲不到,那么可以捕獲父類的異常。
HTTP響應(yīng)狀態(tài)碼參考:
1xx:信息
- 100 Continue : 服務(wù)器僅接收到部分請(qǐng)求,但是一旦服務(wù)器并沒有拒絕該請(qǐng)求,客戶端應(yīng)該繼續(xù)發(fā)送其余的請(qǐng)求。
- 101 Switching Protocols : 服務(wù)器轉(zhuǎn)換協(xié)議:服務(wù)器將遵從客戶的請(qǐng)求轉(zhuǎn)換到另外一種協(xié)議。
2xx:成功
- 200 OK : 請(qǐng)求成功(其后是對(duì)GET和POST請(qǐng)求的應(yīng)答文檔)
- 201 Created : 請(qǐng)求被創(chuàng)建完成,同時(shí)新的資源被創(chuàng)建。
- 202 Accepted : 供處理的請(qǐng)求已被接受,但是處理未完成。
- 203 Non-authoritative Information : 文檔已經(jīng)正常地返回,但一些應(yīng)答頭可能不正確,因?yàn)槭褂玫氖俏臋n的拷貝。
- 204 No Content : 沒有新文檔。瀏覽器應(yīng)該繼續(xù)顯示原來的文檔。如果用戶定期地刷新頁(yè)面,而Servlet可以確定用戶文檔足夠新,這個(gè)狀態(tài)代碼是很有用的。
- 205 Reset Content : 沒有新文檔。但瀏覽器應(yīng)該重置它所顯示的內(nèi)容。用來強(qiáng)制瀏覽器清除表單輸入內(nèi)容。
- 206 Partial Content : 客戶發(fā)送了一個(gè)帶有Range頭的GET請(qǐng)求,服務(wù)器完成了它。
3xx:重定向
- 300 Multiple Choices : 多重選擇。鏈接列表。用戶可以選擇某鏈接到達(dá)目的地。最多允許五個(gè)地址。
- 301 Moved Permanently : 所請(qǐng)求的頁(yè)面已經(jīng)轉(zhuǎn)移至新的url。
- 302 Moved Temporarily : 所請(qǐng)求的頁(yè)面已經(jīng)臨時(shí)轉(zhuǎn)移至新的url。
- 303 See Other : 所請(qǐng)求的頁(yè)面可在別的url下被找到。
- 304 Not Modified : 未按預(yù)期修改文檔??蛻舳擞芯彌_的文檔并發(fā)出了一個(gè)條件性的請(qǐng)求(一般是提供If-Modified-Since頭表示客戶只想比指定日期更新的文檔)。服務(wù)器告訴客戶,原來緩沖的文檔還可以繼續(xù)使用。
- 305 Use Proxy : 客戶請(qǐng)求的文檔應(yīng)該通過Location頭所指明的代理服務(wù)器提取。
- 306 Unused : 此代碼被用于前一版本。目前已不再使用,但是代碼依然被保留。
- 307 Temporary Redirect : 被請(qǐng)求的頁(yè)面已經(jīng)臨時(shí)移至新的url。
4xx:客戶端錯(cuò)誤
- 400 Bad Request : 服務(wù)器未能理解請(qǐng)求。
- 401 Unauthorized : 被請(qǐng)求的頁(yè)面需要用戶名和密碼。
- 401.1 : 登錄失敗。
- 401.2 : 服務(wù)器配置導(dǎo)致登錄失敗。
- 401.3 : 由于 ACL 對(duì)資源的限制而未獲得授權(quán)。
- 401.4 : 篩選器授權(quán)失敗。
- 401.5 : ISAPI/CGI 應(yīng)用程序授權(quán)失敗。
- 401.7 : 訪問被 Web 服務(wù)器上的 URL 授權(quán)策略拒絕。這個(gè)錯(cuò)誤代碼為 IIS 6.0 所專用。
- 402 Payment Required : 此代碼尚無法使用。
- 403 Forbidden : 對(duì)被請(qǐng)求頁(yè)面的訪問被禁止。
- 403.1 : 執(zhí)行訪問被禁止。
- 403.2 : 讀訪問被禁止。
- 403.3 : 寫訪問被禁止。
- 403.4 : 要求 SSL。
- 403.5 : 要求 SSL 128。
- 403.6 : IP 地址被拒絕。
- 403.7 : 要求客戶端證書。
- 403.8 : 站點(diǎn)訪問被拒絕。
- 403.9 : 用戶數(shù)過多。
- 403.10 : 配置無效。
- 403.11 : 密碼更改。
- 403.12 : 拒絕訪問映射表。
- 403.13 : 客戶端證書被吊銷。
- 403.14 : 拒絕目錄列表。
- 403.15 : 超出客戶端訪問許可。
- 403.16 : 客戶端證書不受信任或無效。
- 403.17 : 客戶端證書已過期或尚未生效。
- 403.18 : 在當(dāng)前的應(yīng)用程序池中不能執(zhí)行所請(qǐng)求的 URL。這個(gè)錯(cuò)誤代碼為 IIS 6.0 所專用。
- 403.19 : 不能為這個(gè)應(yīng)用程序池中的客戶端執(zhí)行 CGI。這個(gè)錯(cuò)誤代碼為 IIS 6.0 所專用。
- 403.20 : Passport 登錄失敗。這個(gè)錯(cuò)誤代碼為 IIS 6.0 所專用。
- 404 Not Found : 服務(wù)器無法找到被請(qǐng)求的頁(yè)面。
- 404.0 : 沒有找到文件或目錄。
- 404.1 : 無法在所請(qǐng)求的端口上訪問 Web 站點(diǎn)。
- 404.2 : Web 服務(wù)擴(kuò)展鎖定策略阻止本請(qǐng)求。
- 404.3 : MIME 映射策略阻止本請(qǐng)求。
- 405 Method Not Allowed請(qǐng)求中指定的方法不被允許。
- 406 Not Acceptable : 服務(wù)器生成的響應(yīng)無法被客戶端所接受。
- 407 Proxy Authentication Required : 用戶必須首先使用代理服務(wù)器進(jìn)行驗(yàn)證,這樣請(qǐng)求才會(huì)被處理。
- 408 Request Timeout : 請(qǐng)求超出了服務(wù)器的等待時(shí)間。
- 409 Conflict : 由于沖突,請(qǐng)求無法被完成。
- 410 Gone : 被請(qǐng)求的頁(yè)面不可用。
- 411 Length Required : "Content-Length" 未被定義。如果無此內(nèi)容,服務(wù)器不會(huì)接受請(qǐng)求。
- 412 Precondition Failed : 請(qǐng)求中的前提條件被服務(wù)器評(píng)估為失敗。
- 413 Request Entity Too Large : 由于所請(qǐng)求的實(shí)體的太大,服務(wù)器不會(huì)接受請(qǐng)求。
- 414 Request-url Too Long : 由于url太長(zhǎng),服務(wù)器不會(huì)接受請(qǐng)求。當(dāng)post請(qǐng)求被轉(zhuǎn)換為帶有很長(zhǎng)的查詢信息的get請(qǐng)求時(shí),就會(huì)發(fā)生這種情況。
- 415 Unsupported Media Type : 由于媒介類型不被支持,服務(wù)器不會(huì)接受請(qǐng)求。
- 416 Requested Range Not Satisfiable : 服務(wù)器不能滿足客戶在請(qǐng)求中指定的Range頭。
- 417 Expectation Failed : 執(zhí)行失敗。
- 423 : 鎖定的錯(cuò)誤。
5xx:服務(wù)器錯(cuò)誤
- 500 Internal Server Error : 請(qǐng)求未完成。服務(wù)器遇到不可預(yù)知的情況。
- 500.12 : 應(yīng)用程序正忙于在 Web 服務(wù)器上重新啟動(dòng)。
- 500.13 : Web 服務(wù)器太忙。
- 500.15 : 不允許直接請(qǐng)求 Global.asa。
- 500.16 : UNC 授權(quán)憑據(jù)不正確。這個(gè)錯(cuò)誤代碼為 IIS 6.0 所專用。
- 500.18 : URL 授權(quán)存儲(chǔ)不能打開。這個(gè)錯(cuò)誤代碼為 IIS 6.0 所專用。
- 500.100 : 內(nèi)部 ASP 錯(cuò)誤。
- 501 Not Implemented : 請(qǐng)求未完成。服務(wù)器不支持所請(qǐng)求的功能。
- 502 Bad Gateway : 請(qǐng)求未完成。服務(wù)器從上游服務(wù)器收到一個(gè)無效的響應(yīng)。
- 502.1 : CGI 應(yīng)用程序超時(shí)?! ?/li>
- 502.2 : CGI 應(yīng)用程序出錯(cuò)。
- 503 Service Unavailable : 請(qǐng)求未完成。服務(wù)器臨時(shí)過載或當(dāng)機(jī)。
- 504 Gateway Timeout : 網(wǎng)關(guān)超時(shí)。
- 505 HTTP Version Not Supported : 服務(wù)器不支持請(qǐng)求中指明的HTTP協(xié)議版本