2015-05-28 3 views
1

У меня есть следующий код, который делает http-запрос с использованием urllib2. Код находится между try/except за исключением ошибки http. В какой-то момент я получаю urllib2.HttpError. Я поймал это, и я хочу сделать вышеприведенный код (за пределами catch) n раз, прежде чем обрабатывать исключение в другом вопросе. Вот следующий код с goto .label, чтобы продемонстрировать, что я хочу сделать, но не нашел, как это сделать.python: looping from exception

recoveryTimes = 5 
try: 
      data = urllib.urlencode(values)  
      req = urllib2.Request(url, data) 
      label .request (this is where i want to jump after the exception) 
      urllib2.urlopen(req) 
      response = urllib2.urlopen(req)  
      the_page = response.read() 

except urllib2.HTTPError: 
       if (recoveryTimes > 0): 
        goto .request 
       else: 
        self.setUrllib2Proxy() 

для подведения итогов, если http-запрос, если не удается, я хочу попробовать снова и снова. Только после неудачных «n» раз я хочу перейти к инструкции else.

+0

Вы можете рассмотреть возможность использования [reitinging] (https://pypi.python.org/pypi/retrying). –

ответ

0

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

import time 
import math 

def retry(tries, delay=1): 
    '''Retries a function or method until it returns True. 

    delay sets the initial delay in seconds. tries must be at least 0, and delay 
    greater than 0.''' 
    tries = math.floor(tries) 
    if tries < 0: 
     raise ValueError("tries must be 0 or greater") 
    if delay <= 0: 
     raise ValueError("delay must be greater than 0") 
    def deco_retry(f): 
     def f_retry(*args, **kwargs): 
      mtries = tries 
      rv = f(*args, **kwargs) 
      while mtries > 0: 
       if rv is True: 
        return True 
       mtries -= 1 
       time.sleep(delay) 
       rv = f(*args, **kwargs) 
      return False 
     return f_retry 
    return deco_retry 

Сделайте свой код в качестве метода, они должны возвращать истинным или ложным, и украсить его с предыдущим кодом