2015-05-28 2 views
2

Моя проблема очень проста. У меня есть код try/except. В попытке у меня есть попытки HTTP-запросов и, кроме того, у меня есть несколько способов справиться с исключениями, которые я получаю.python Время попытки, кроме

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

В свободном языке это будет выглядеть следующим образом:

try for n seconds: 
    doSomthing() 
except (after n seconds): 
    handleException() 

это середина кода. Не функция. и я должен поймать тайм-аут и обработать его. Я не могу просто продолжить код.

 while (recoveryTimes > 0): 
      try (for 10 seconds): 

       urllib2.urlopen(req) 
       response = urllib2.urlopen(req)  
       the_page = response.read() 
       recoveryTimes = 0 

      except (urllib2.URLError, httplib.BadStatusLine) as e: 
       print str(e.__unicode__()) 
       print sys.exc_info()[0] 
       recoveryTimes -= 1 

       if (recoveryTimes > 0): 
        print "Retrying request. Requests left %s" %recoveryTimes 
        continue 
       else: 
        print "Giving up request, changing proxy." 
        setUrllib2Proxy() 
        break 
      except (timedout, 10 seconds has passed) 
       setUrllib2Proxy() 
       break 

решение мне нужно для try (for 10 seconds) и except (timeout, after 10 seconds)

+0

Вы ищете Время ожидания HTTPREQUEST? Если да, то можно корректно обрабатывать – therealprashant

+1

возможный дубликат [Тайм-аут при вызове функции Python] (http://stackoverflow.com/questions/492519/timeout-on-a-python-function-call) – Daenyth

+0

Какой вы используете для обработки HTTP-запросов? – dhke

ответ

5

Проверьте documentation

import urllib2 
request = urllib2.Request('http://www.yoursite.com') 
try: 
    response = urllib2.urlopen(request, timeout=4) 
    content = response.read() 
except urllib2.URLError, e: 
    print e 

Если вы хотите, чтобы поймать более конкретные ошибки проверки этого post

или в качестве альтернативы для запросов

import requests 
try: 
    r = requests.get(url,timeout=4) 
except requests.exceptions.Timeout as e: 
    # Maybe set up for a retry 
    print e 

except requests.exceptions.RequestException as e: 
    print e 

Подробнее об исключениях при использовании запросов можно найти в docs или в этом post

+0

Выглядит солидно. Я пробую это прямо сейчас, это может занять некоторое время. Благодарю. –

+0

Самое изящное решение. Я совсем идиот, чтобы пропустить это ... –

-1
n = 0 
seconds = 5 # Replace with desired seconds 
while n < seconds + 1: 
    n += 1 
    try: 
     do_something() 
    except: 
     if n == seconds: 
      do_something_else() 
+0

doSomthing() застревает (или занимает больше «n» секунд) и не может достигнуть n = + 1 –

+0

iof он застрял, и он перейдет к кроме блока, может достигать n + = 1 – farhawa

+0

@farhawa. Он не переходит к исключающему блоку. Это не ошибка, она застревает. –

0

общее решение, если вы используете UNIX:

import time as time 
import signal 

#Close session 
def handler(signum, frame): 
    print 1 
    raise Exception('Action took too much time') 


signal.signal(signal.SIGALRM, handler) 
signal.alarm(3) #Set the parameter to the amount of seconds you want to wait 

try: 
    #RUN CODE HERE 

    for i in range(0,5): 
     time.sleep(1) 
except: 
    print 2 

signal.alarm(10) #Resets the alarm to 10 new seconds 
signal.alarm(0) #Disables the alarm 
Смежные вопросы