@Bergis

Как обработать исключение в потоке?

Подскажите как можно решить проблему с обработкой исключений в многопоточности.
Допустим у меня есть код ,в котором у приложения появляется ошибка при запросе к google.com :
import requests as s 
from time import sleep

def main():
	web = ['https://yandex.ru','https://google.com','https://habr.com','https://vk.com']
	for i in web:
		try:
			s.get(i)
		except:
			sleep(5)
			s.get(i)


my_thread1 = threading.Thread(target=main)
my_thread1.start()
my_thread2 = threading.Thread(target=main)
my_thread2.start()

Как сделать так , чтобы программа обработала ошибку , подождала 5 секунд и продолжила дальше работать в цикле ?
  • Вопрос задан
  • 303 просмотра
Пригласить эксперта
Ответы на вопрос 2
@Alexa2007
Вот так работает без ошибок
import requests as s 
from time import sleep
import threading

def main():
  web = ['https://google.com','https://habr.com','https://vk.com']

  for i in web:
    try:
        r = s.get(i)
    except:

        print('error')
        sleep(5)
        s.get(i)


my_thread1 = threading.Thread(target=main)
my_thread1.start()
my_thread2 = threading.Thread(target=main)
my_thread2.start()
Ответ написан
shurshur
@shurshur
Сисадмин, просто сисадмин...
Как-нибудь так:

web_urls = [...]
attempts = 5
for url in web_urls:
  for attempt in range(0,attempts):
    r = None
    try:
       r = requests.get(url)
    except requests.exceptions.ConnectionError, requests.exceptions.ReadTimeout:
       if attempt < attempts-1:
         sleep(5)
       else:
         print (f"Oops request failed and no more attempts for {url}")
    if r:
      break


Не надо ловить except без конкретизации ошибки и даже без вывода её. В крайнем случае надо её словить и показать, чтобы хоть было известно, что она происходила:

try:
  ...
except Exception as e:
  print (e) # а ещё лучше использовать модуль traceback
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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