套接字超时:超时python请求

时间:2014-03-25 08:57:20

标签: python-requests socket-timeout-exception

使用requests python lib,我发出G​​ET请求,并处理超时异常(以及我不会在此处显示的其他异常),例如

import requests
timeout1=20
timeout2=40

try:
    #first attempt
    resp = requests.get(base_url+resource, params=payload, headers=headers,
    timeout=timeout1)
except requests.exceptions.Timeout:
    #timed out, retry once
    try:
       resp = requests.get(base_url+resource, params=payload, headers=headers,
       timeout=timeout2)
       return resp.json()
    except requests.exceptions.RequestException as e:
       #Still failed; return error code
       return -1

大部分时间都可以正常运行,但是有时我的程序会完全退出并显示错误socket.timeout: timed out,而不是抛出requests.exceptions.Timeout,这会被抓住并处理。

为什么请求lib的行为如下?我该怎么办呢?

2 个答案:

答案 0 :(得分:1)

答案:

try:
    data = sock.recv(256)
except socket.timeout:
    data="NO RESPONSE"

它不会退出!

答案 1 :(得分:1)

我认为这是请求使用的urllib3的问题:

https://github.com/kennethreitz/requests/issues/1236

你必须抓住socket.timeout错误。 (基于jb在Correct way to try/except using Python requests module?的评论)