1. 程式人生 > 實用技巧 >urllib.request模組(2):處理異常

urllib.request模組(2):處理異常

1.URLError

該類來自urllib.error模組,由request模組產生的異常都可以通過捕獲這個類來處理。

開啟一個不存在的頁面,程式碼:

from urllib import request,error

try:
    response=request.urlopen('https://cuiqingcai.com/index.htm')
except error.URLError as e:
    print(e.reason)#屬性reason,用來返回錯誤的原因

執行結果:輸出Not Found

2.HTTPError

它是URLError的子類,專門用來處理HTTP請求錯誤。

它有三個屬性:

code:返回HTTP狀態碼,比如404表示頁面不存在。

reason:返回錯誤的原因。

headers:返回請求頭。

捕獲HTTPError異常,輸出code,reason,headers屬性

程式碼:

from urllib import request,error

try:
    response=request.urlopen('https://cuiqingcai.com/index.htm')
except error.HTTPError as e:
    print(e.reason,e.code,e.headers,sep='\n')

執行結果:

又由於URLError是HTTPError的父類,所以可以先選擇捕獲子類的錯誤,再去捕獲父類的錯誤

。所以更好的寫法如下。

程式碼:

from urllib import request,error

try:
    response=request.urlopen('https://cuiqingcai.com/index.htm')
except error.HTTPError as e:
    print(e.reason,e.code,e.headers,sep='\n')
except error.URLError as e:
    print(e.reason)
#如果不是HTTPError異常,就會捕獲URLError異常
else: print('Request Successfully
')
#否則無異常

有時reason屬性返回的不一定是字串,也可能是一個物件。

程式碼:

import socket
import urllib.request
import urllib.error

try:
    response=urllib.request.urlopen('https://www.baidu.com',timeout=0.01)
except urllib.error.URLError as e:
    print(type(e.reason))
    if isinstance(e.reason,socket.timeout):#用isinstance()方法來判斷reason的型別
        print('TIME OUT')

執行結果:輸出

<class 'socket.timeout'>
TIME OUT

可以看出reason屬性的結果是socket.timeout類。

參考用書《python3網路爬蟲開發實戰》