如何使用Python处理套接字超时

时间:2019-01-25 16:53:06

标签: python python-requests timeout

我在RaspberryPi上使用Python 3.4读取数据并将其上传到Weather Underground。大部分时间都可以正常运行,但是有时候我的互联网连接不畅或者Weather Underground服务器运行缓慢。前几天,我收到此错误消息:

socket.timeout:_ssl.c:584:握手操作超时

我有try / except代码,但与任何异常都不匹配。我以为最后一个“例外:”将捕获该错误,但我想不是。我应该只添加“ socket.timeout:除外”吗?

try:
    r = requests.get(full_URL, timeout=5) # send data to WU

    # If uploaded successfully, website will reply with 200
    if r.status_code == 200:
        return(True)
    else:
        print('Upload Error: {}  {}'.format(r.status_code, r.text))
        return(False)

except requests.exceptions.ConnectionError:
    print("Upload Error in upload2WU() - ConnectionError")
    return(False)

except requests.exceptions.NewConnectionError:
    print("Upload Error in upload2WU() - NewConnectionError")
    return(False)

except requests.exceptions.MaxRetryError:
    print("Upload Error in upload2WU() - MaxRetryError")
    return(False)

except socket.gaierror:
    print("Upload Error in upload2WU() - socket.gaierror")
    return(False)

except:
    print("Upload Error in upload2WU() - other")
    return(False)

我确实有两个其他地方正在使用request.get(),但它们都使用try:,但除外:

try:
    response = requests.get(getUrl, timeout=5).json()
    if len(response) > 1:
        if isNumber(response['current_observation']['precip_today_in']):
            daily_rain = float(response['current_observation']['precip_today_in'])
            print('Suntec station daily rain={}'.format(daily_rain))  
            return(daily_rain)

    return(ERR_INVALID_DATA)

except:
    print("Error in WU_download.py getDailyRain() - failed get() request")
    return(ERR_FAILED_GET)

这是另一个:

    try:
        response = requests.get(getUrl, timeout=5).json()
        if len(response) > 1: # valid response returns 3, if there's an error, the len() is 1
            if isNumber(response['current_observation']['pressure_in']):
                nearby_pressure = float(response['current_observation']['pressure_in'])
                nearby_last_update_time = int(response['current_observation']['observation_epoch'])
                if(nearby_pressure) > 25: # a pressure less than 25 inHg isn't gonna be valid
                    return(nearby_pressure)

        # Didn't get a valid pressure. Try the next station in WU_STATIONS tuple
        print("Couldn't get pressure data from {}".format(WU_STATIONS[i]))
        nearby_pressure = ERR_INVALID_DATA
        nearby_last_update_time = 0
        i = i + 1
        time.sleep(10)

    except:
        print("Error in WU_download.py getPressure(), failed get request for station {}".format(WU_STATIONS[i]))
        i = i + 1
        if (i >= len(WU_STATIONS)):
            return(ERR_FAILED_GET)

0 个答案:

没有答案