Задать вопрос
NullByte
@NullByte
Bad gateway

Обработка ошибок в Python — Отправка повторного HTTPS запроса. Как красиво реализовать?

Написал программу на Питоне, одна из функций которых - отправлять HTTPS-запрос с помощью библиотеки httplib2 и получать ответ. Однако столкнулся с проблемой: если время ожидания превысило заданный промежуток - вываливается ошибка. Решил использовать обработчик ошибок и сделать так, чтобы при таймауте снова отправлялся запрос. А что делать, если ошибка вываливается снова и снова? Тогда я применил метод рекурсии и при ошибке вызывается та же функция с тем же параметром, но уже внутри нее. Собственно вот получившийся код:
def request(param):
	headers = {}
	url_get = 'https://example.com/?input='+str(param)
	https = httplib2.Http('.cache', timeout=10)
	try:
		resp, content = https.request(url_get, 'GET', headers=headers)
	except httplib2.ServerNotFoundError:
		print('Сервер недоступен, повторное подключение')
		content = request(param)
	except ConnectionRefusedError:
		print('Соединение разорвано, повторное подключение')
		content = request(param)
	except httplib2.socket.timeout:
		print('Таймаут запроса, повторное подключение')
		content = request(param)
	except OSError:
		print('Нету подключения к сети, ожидание 60 секунд')
		time.sleep(60)
		content = request(param)
	return content

Вопрос такой: насколько этот метод правильный? Есть ли альтернативные варианты?
  • Вопрос задан
  • 2209 просмотров
Подписаться 2 Оценить Комментировать
Решения вопроса 1
@arctblake
Вместо рекурсии - цикл. Зачем рекурсия, если вы просто повторяете одно и то же? Вместо фиксированного таймаута - динамический. Чаще всего делают степени двойки. При превышении какого-то макс значения - либо сброс до нуля, либо просто отключение.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
sim3x
@sim3x
Использовать scrapy
Использовать очереди
Ответ написан
Комментировать
angru
@angru
посмотрите на retrying
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы