Общее правило для оператора try
- выполнять как можно меньше кода внутри него; только поместите код, который вы ожидаете, приведет к ошибке, которую вы хотите поймать в нем; весь другой код идет до или после оператора.
Не перехватывайте ошибки, с которыми вы не знаете, что делать. Выход из программы - редко правильная вещь; это произойдет в любом случае, если никто больше не поймает исключение, поэтому предоставьте вашему звонящему возможность обработать его.
И, наконец, не создавайте URL-адреса самостоятельно; пусть библиотека requests
сделает это за вас. Базовый URL-адрес http://www.example.com
; параметр id
и его значение могут быть переданы через dict
в requests.get
.
Ваш внешний l oop будет перебирать различные параметры, используемые для построения URL; внутренний l oop будет пытаться выполнить запрос, пока он не будет выполнен успешно. Как только внутренний l oop завершается, вы можете использовать ответ для вызова parseAndWrite
.
def archive(initial_index, final_index):
base_url = 'https://www.example.com/'
for i in range(initial_index, final_index + 1):
while True:
try:
res = requests.get(base_url, params={'id': i})
except requests.exception.ConnectionError:
print("[-] Connection lost, trying again")
continue
else:
break
parseAndWrite(res.text)
print('{} archived'.format(i))
archived(1, 10000)
Вы можете также рассмотреть возможность разрешения requests
повторных попыток для вас. См. Могу ли я установить max_retries для request.request? для начала.