2017-02-07 2 views
1

Я пытаюсь повторить функцию всякий раз, когда возникает исключение с помощью модуля повторной попытки. Тем не менее, он никогда не повторяет попытку, хотя есть исключение. Например, взгляните на фрагмент кода ниже. Он должен повторять 10 раз со случайным интервалом для второго URL-адреса в url_list, а затем сбой. Может ли кто-нибудь сказать мне, почему он не повторяет?python retrying module не повторяет попытку исключения

import urllib2 
from retrying import retry 


def retry_if_exception(exception): 
    """Return True if we should retry (in this case when it's any Exception), False otherwise""" 
    return isinstance(exception, Exception) 


@retry(retry_on_exception=retry_if_exception, wait_random_min=1000, wait_random_max=1500, stop_max_attempt_number=10) 
def start_http_request(url): 
    try: 
     response = urllib2.urlopen(url) 
     print response 
    except Exception as err: 
     retry_if_exception(err) 
     print (err.reason) 

url_list = ['https://www.google.ca', 'http://goo123213.ca', 'http://code.activestate.com'] 

for url in url_list: 
    print url 
    start_http_request(url) 

Ссылки: https://pypi.python.org/pypi/retrying

ответ

1

В соответствии с Документами retrying, retry_on_exception должна быть функция, которая возвращает True, если она должна быть повторена. Вместо этого вы поставляете его с типом. Попробуйте следующее:

@retry(retry_on_exception=lambda e: True, wait_random_min=1000, wait_random_max=1500, stop_max_attempt_number=10) 

... который должен сказать ему повторить попытку при каждом сбое.

0

Вы должны рассмотреть документы, вы не делаете это правильно:

retry_on_exception ожидает функцию, которая будет вызвана, чтобы определить, должен ли он повторить ... если вы хотите сделать это на каких-либо исключений, просто оставьте его:

@retry(wait_random_min=1000, wait_random_max=1500, stop_max_attempt_number=10) 

Если вы хотите указать конкретные условия:

@retry(retry_on_exception=retry_if_exception,wait_random_min=1000, wait_random_max=1500, stop_max_attempt_number=10) 

def retry_if_exception(exception): 
    """Return True if we should retry (in this case when it's any Exception), False otherwise""" 
    return isinstance(exception, Exception) 
+0

вы правы, мое плохое. Однако я изменил код (обновленный выше), но не повторил. – Rihan

+0

@Rihan Если вы хотите повторить все исключения, вам не нужно указывать тип исключения. См. Мой обновленный ответ – TemporalWolf

+0

Магия, вы на месте. Я также хотел бы добавить, что основной причиной проблемы я пытался поймать исключение вручную в блоке повторных попыток, удалив его, решив проблему. – Rihan

Смежные вопросы