中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Python3網絡爬蟲實戰-21、使用Urllib:處理異常

發布時間:2020-06-04 13:30:09 來源:網絡 閱讀:170 作者:學Python派森 欄目:編程語言

在前面一節我們了解了 Request 的發送過程,但是在網絡情況不好的情況下,出現了異常怎么辦呢?這時如果我們不處理這些異常,程序很可能報錯而終止運行,所以異常處理還是十分有必要的。

Urllib 的 error 模塊定義了由 request 模塊產生的異常。如果出現了問題,request 模塊便會拋出 error 模塊中定義的異常,本節會對其進行詳細的介紹。

1. URLError

URLError 類來自 Urllib 庫的 error 模塊,它繼承自 OSError 類,是 error 異常模塊的基類,由 request 模塊生的異常都可以通過捕獲這個類來處理。

它具有一個屬性 reason,即返回錯誤的原因。

下面用一個實例來感受一下:

from urllib import request, error
try:
    response = request.urlopen('http://cuiqingcai.com/index.htm')
except error.URLError as e:
    print(e.reason)

我們打開一個不存在的頁面,照理來說應該會報錯,但是這時我們捕獲了 URLError 這個異常,運行結果如下:

Not?Found
Python資源分享qun 784758214 ,內有安裝包,PDF,學習視頻,這里是Python學習者的聚集地,零基礎,進階,都歡迎

程序沒有直接報錯,而是輸出了如上內容,這樣通過如上操作,我們就可以避免程序異常終止,同時異常得到了有效處理。

2. HTTPError

它是 URLError 的子類,專門用來處理 HTTP 請求錯誤,比如認證請求失敗等等。

它有三個屬性。

  • code,返回 HTTP Status Code,即狀態碼,比如 404 網頁不存在,500 服務器內部錯誤等等。
  • reason,同父類一樣,返回錯誤的原因。
  • headers,返回 Request Headers。

下面我們來用幾個實例感受一下:

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

運行結果:

Not Found
404
Date: Mon, 17 Jun 2019 04:52:50 GMT
Content-Type: text/html; charset=utf-8
Transfer-Encoding: chunked
Connection: close
Vary: Accept-Encoding
Status: 404 Not Found
Cache-Control: no-cache
Strict-Transport-Security: max-age=31536000
X-XSS-Protection: 1; mode=block
X-Request-Id: e65fb029-a4fd-46e2-91c3-9616ccc2f879
X-Runtime: 0.006814
X-Frame-Options: SAMEORIGIN
X-Content-Type-Options: nosniff
X-Powered-By: Phusion Passenger 6.0.2
Server: nginx + Phusion Passenger 6.0.2

依然是同樣的網址,在這里我們捕獲了 HTTPError 異常,輸出了 reason、code、headers 屬性。

因為 URLError 是 HTTPError 的父類,所以我們可以先選擇捕獲子類的錯誤,再去捕獲父類的錯誤,所以上述代碼更好的寫法如下:

from urllib import request, error

try:
    response = request.urlopen('http://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)
else:
    print('Request Successfully')

這樣我們就可以做到先捕獲 HTTPError,獲取它的錯誤狀態碼、原因、Headers 等詳細信息。如果非 HTTPError,再捕獲 URLError 異常,輸出錯誤原因。最后用 else 來處理正常的邏輯,這是一個較好的異常處理寫法。

有時候 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):
        print('TIME OUT')

在這里我們直接設置了超時時間來強制拋出 timeout 異常。

運行結果如下:

<class 'socket.timeout'>
TIME OUT
Python資源分享qun 784758214 ,內有安裝包,PDF,學習視頻,這里是Python學習者的聚集地,零基礎,進階,都歡迎

可以發現 reason 屬性的結果是 socket.timeout 類。所以在這里我們可以用 isinstance() 方法來判斷它的類型,做出更詳細的異常判斷。

3. 結語

本節講述了 error 模塊的相關用法,通過合理地捕獲異常可以做出更準確的異常判斷,使得程序更佳穩健。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

务川| 灵武市| 邵东县| 棋牌| 灯塔市| 牙克石市| 黑山县| 富锦市| 彰化市| 建德市| 祁连县| 寿光市| 溧阳市| 桦川县| 乌拉特中旗| 迁安市| 万宁市| 乌兰县| 梨树县| 博湖县| 普兰县| 青冈县| 正镶白旗| 永顺县| 正安县| 白银市| 衡水市| 巴林右旗| 仙游县| 盘山县| 灯塔市| 康保县| 兴和县| 财经| 长宁县| 龙海市| 佛学| 安龙县| 高安市| 巴彦县| 瑞丽市|