1在我們用urlopen或opener.open方法發(fā)出一個(gè)請(qǐng)求時(shí),如果urlopen或opener.open不能處理這個(gè)response,就產(chǎn)生錯(cuò)誤。
這里主要說(shuō)的是URLError和HTTPError,以及對(duì)它們的錯(cuò)誤處理。
URLError
URLError 產(chǎn)生的原因主要有:
- 沒(méi)有網(wǎng)絡(luò)連接
- 服務(wù)器連接失敗
- 找不到指定的服務(wù)器
我們可以用try except語(yǔ)句來(lái)捕獲相應(yīng)的異常。下面的例子里我們?cè)L問(wèn)了一個(gè)不存在的域名:
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>
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)碼。
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,說(shuō)明服務(wù)器無(wú)法找到被請(qǐng)求的頁(yè)面。
通常產(chǎn)生這種錯(cuò)誤的,要么url不對(duì),要么ip被封。
改進(jìn)版
由于HTTPError的父類是URLError,所以父類的異常應(yīng)當(dāng)寫到子類異常的后面,所以上述的代碼可以這么改寫:
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ù)器并沒(méi)有拒絕該請(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
沒(méi)有新文檔。瀏覽器應(yīng)該繼續(xù)顯示原來(lái)的文檔。如果用戶定期地刷新頁(yè)面,而Servlet可以確定用戶文檔足夠新,這個(gè)狀態(tài)代碼是很有用的。
205 Reset Content
沒(méi)有新文檔。但瀏覽器應(yīng)該重置它所顯示的內(nèi)容。用來(lá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ù)器告訴客戶,原來(lái)緩沖的文檔還可以繼續(xù)使用。
305 Use Proxy
客戶請(qǐng)求的文檔應(yīng)該通過(guò)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
訪問(wèn)被 Web 服務(wù)器上的 URL 授權(quán)策略拒絕。這個(gè)錯(cuò)誤代碼為 IIS 6.0 所專用。
402 Payment Required
此代碼尚無(wú)法使用。
403 Forbidden
對(duì)被請(qǐng)求頁(yè)面的訪問(wèn)被禁止。
403.1
執(zhí)行訪問(wèn)被禁止。
403.2
讀訪問(wèn)被禁止。
403.3
寫訪問(wèn)被禁止。
403.4
要求 SSL。
403.5
要求 SSL 128。
403.6
IP 地址被拒絕。
403.7
要求客戶端證書。
403.8
站點(diǎn)訪問(wèn)被拒絕。
403.9
用戶數(shù)過(guò)多。
403.10
配置無(wú)效。
403.11
密碼更改。
403.12
拒絕訪問(wèn)映射表。
403.13
客戶端證書被吊銷。
403.14
拒絕目錄列表。
403.15
超出客戶端訪問(wèn)許可。
403.16
客戶端證書不受信任或無(wú)效。
403.17
客戶端證書已過(guò)期或尚未生效。
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ù)器無(wú)法找到被請(qǐng)求的頁(yè)面。
404.0
沒(méi)有找到文件或目錄。
404.1
無(wú)法在所請(qǐng)求的端口上訪問(wèn) 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)無(wú)法被客戶端所接受。
407 Proxy Authentication Required
用戶必須首先使用代理服務(wù)器進(jìn)行驗(yàn)證,這樣請(qǐng)求才會(huì)被處理。
408 Request Timeout
請(qǐng)求超出了服務(wù)器的等待時(shí)間。
409 Conflict
由于沖突,請(qǐng)求無(wú)法被完成。
410 Gone
被請(qǐng)求的頁(yè)面不可用。
411 Length Required
"Content-Length" 未被定義。如果無(wú)此內(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è)無(wú)效的響應(yīng)。
502.1
CGI 應(yīng)用程序超時(shí)。 ·
502.2
CGI 應(yīng)用程序出錯(cuò)。
503 Service Unavailable
請(qǐng)求未完成。服務(wù)器臨時(shí)過(guò)載或當(dāng)機(jī)。
504 Gateway Timeout
網(wǎng)關(guān)超時(shí)。
505 HTTP Version Not Supported
服務(wù)器不支持請(qǐng)求中指明的HTTP協(xié)議版本