Как обработать время ожидания сокета в Python - PullRequest
0 голосов
/ 25 января 2019

Я использую Python 3.4 на RaspberryPi для чтения и загрузки данных в Weather Underground. Он прекрасно работает большую часть времени, но иногда либо мои интернет-соединения плохие, либо серверы Weather Underground работают медленно На днях я получил эту ошибку:

socket.timeout: _ssl.c: 584: Тайм-аут операции рукопожатия

У меня есть попытка / кроме кода, но он не совпадает ни с одним из исключений. Я предположил, что последнее «кроме:» поймало бы ошибку, но я думаю, что нет. Должен ли я просто добавить «кроме 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)
...