2015-05-18 3 views
0

У меня есть программа, которая загружает страницы с сайта, находит ссылки на изображения в них и загружает эти фотографии. Если я попытаюсь запустить эту программу на компьютере с быстрым и стабильным подключением к Интернету - все работает отлично в течение нескольких дней и недель. Но если я пробую эту программу на компьютере с медленным или нестабильным подключением к Интернету, у меня есть одна проблема - модуль «try-except» не работает корректно.python 3 запроса try-except failure

--- это содержание загрузки функции - любой контент (страница или изображение)

def downl(self,addr,cook,head2,errmess): 
    global result 
    try: 
     result=requests.get(addr, cookies=cook, headers=head2) 
    except: 
     print(errmess) # error message 
     time.sleep(5) 
    return result 

Я послал на эту функцию ссылку на эту страницу, то другая функция ищет picture_link в этой странице, и затем я посылаю к той же функции (downl) picture_link. После этого я сохраняю результат функции (downl) как файл .jpg. Как я уже сказал - на компьютере с обычным подключением к Интернету все работает нормально. В результате у меня есть 5, 10 или 5000 изображений на жестком диске.

Но позвольте мне показать небольшой пример того, что происходит с плохим подключением к Интернету. Предположим, у нас есть 2 страницы и 1 изображение на каждой странице.

step 1) downloading 1st page (def downl) 
step 2) taking picture_link from it 
step 3) downloading picture (def downl) 
step 4) saving 1st picture to hdd 1.jpg 
step 5) downloading 2nd page (def downl) 
step 6) taking picture_link from it 
step 7) downloading picture (def downl) and receivind error message (errmess) 
step 8) saving 2nd picture to hdd 2.jpg 

только, например: 1-е изображение может быть нормальным jpg с соответствующим содержимым. Вторая картинка будет файлом с расширением jpg, но будет иметь 2-ю страницу, поскольку она является содержимым (это будет обычный html-файл, сохраненный с неправильным расширением «jpg»)

другие слова: была проблема с Интернетом во время загрузки второй картинка, программа напечатала ошибку об этом (errmess), но INSTEAD из COUNTLESS повторной попытки (как и предполагалось в моей функции), она каким-то образом прошла через блок try-except и вернула предыдущий результат (2-я страница), который был сохранен как 2-е изображение.

Пожалуйста, помогите! Как заставить этот try-except (или запросы) работать FOREVER, UNTILL он загружает то, что он должен загружать (независимо от того, какие ошибки происходят с подключением к Интернету), и не проходит с предыдущим результатом.

Большое спасибо за ваше время и внимание.

+0

'глобальный result' вызывает результат«не удалось»вернуть последний успешный результат. 'result' не переопределяется и все еще' return'-ed. Какова точная ошибка? 'ConnectionError'? – Matthew

+0

да. Я понимаю, что получаю предыдущий результат из-за глобального «результата». Но вопрос о другом - почему программа проходит через try-except, когда она должна крутиться в ней навсегда, пока она не загрузит изображение. о точной ошибке - сегодня вечером я буду на компьютере с плохим интернетом и посмотрю точную ошибку. –

ответ

1

Затем вам нужен некоторое время Истинного цикл, как это:

def downl(self,addr,cook,head2,errmess): 
    global result 
    while(True): 
     try: 
      result=requests.get(addr, cookies=cook, headers=head2) 
      return result 
     except: 
      print(errmess) # error message 
      time.sleep(5) 
+0

Спасибо вам большое! с вашей помощью он работает так, как предполагается.))) Мы ставим его в вечный цикл и выпускаем его только после положительного результата. Могу ли я попросить объяснения? Почему это не работает без True цикла? не пытается - кроме того, должен работать одинаково? Или он предназначен для выполнения только одной итерации? Означает ли это, что try-except - это не цикл, что это просто способ не остановить программу при наличии известной ошибки? –

+0

Ваша последняя гипотеза правильная, try -except - это просто способ поймать исключения (ошибки). Если вам нужен цикл, вы должны использовать цикл (while или for) или рекурсивную функцию. –

+0

Эрик, спасибо вам большое за ответ. Насколько я могу судить - вы работаете на питоне. Может быть, вы могли бы помочь мне с другим вопросом, на который никто не пытается ответить несколько недель? http://stackoverflow.com/questions/30079454/cookies-as-a-global-variable –