簡體   English   中英

如何使用urllib捕獲超時錯誤

[英]How to catch timeout error with urllib

我正在嘗試嘗試,但python 3除外

我可以捕獲HTTPError(錯誤請求)和URLError(找不到主機/路由名稱)

但是我還沒趕上超時錯誤。

 while True:
        try:
            f = urllib.request.urlretrieve(url,csvname)
        except urllib.error.HTTPError as e: #
            print(str(chl) + " Error:" + str(e))


            continue
        except urllib.error.URLError as e: 
            continue
        except socket.timeout as e:
            #I can't catch time out error here
            continue

它返回這個。

如何防止腳本因超時錯誤而停止?

Traceback (most recent call last):
  File "wisdom2.py", line 84, in <module>
    f = urllib.request.urlretrieve(url,csvname)
  File "/Users/whitebear/.pyenv/versions/3.4.6/lib/python3.4/urllib/request.py", line 186, in urlretrieve
    with contextlib.closing(urlopen(url, data)) as fp:
  File "/Users/whitebear/.pyenv/versions/3.4.6/lib/python3.4/urllib/request.py", line 161, in urlopen
    return opener.open(url, data, timeout)
  File "/Users/whitebear/.pyenv/versions/3.4.6/lib/python3.4/urllib/request.py", line 464, in open
    response = self._open(req, data)
  File "/Users/whitebear/.pyenv/versions/3.4.6/lib/python3.4/urllib/request.py", line 482, in _open
    '_open', req)
  File "/Users/whitebear/.pyenv/versions/3.4.6/lib/python3.4/urllib/request.py", line 442, in _call_chain
    result = func(*args)
  File "/Users/whitebear/.pyenv/versions/3.4.6/lib/python3.4/urllib/request.py", line 1211, in http_open
    return self.do_open(http.client.HTTPConnection, req)
  File "/Users/whitebear/.pyenv/versions/3.4.6/lib/python3.4/urllib/request.py", line 1186, in do_open
    r = h.getresponse()
  File "/Users/whitebear/.pyenv/versions/3.4.6/lib/python3.4/http/client.py", line 1227, in getresponse
    response.begin()
  File "/Users/whitebear/.pyenv/versions/3.4.6/lib/python3.4/http/client.py", line 386, in begin
    version, status, reason = self._read_status()
  File "/Users/whitebear/.pyenv/versions/3.4.6/lib/python3.4/http/client.py", line 348, in _read_status
    line = str(self.fp.readline(_MAXLINE + 1), "iso-8859-1")
  File "/Users/whitebear/.pyenv/versions/3.4.6/lib/python3.4/socket.py", line 378, in readinto
    return self._sock.recv_into(b)
TimeoutError: [Errno 60] Operation timed out

     except socket.timeout as e:
NameError: name 'socket' is not defined

在python 3.x上, TimeoutError是內置的異常類。 你可以抓住它

except TimeoutError:
    ...

在python 2.x上,您有兩個選擇:

  1. 捕獲urllib.socket.timeout異常

  2. 捕獲requests.Timeout超時異常

您需要先導入套接字,然后才能使用它:

from urllib import socket

或指定您要談論的套接字來自urllib,即:

except urllib.socket.timeout as e:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM