2013-09-17 3 views
1

У меня есть программа питона, который подключается к серверу для отправки ему некоторые команды, но occisonally я получаю эту ошибкуPython: Как попробовать еще раз, когда испытывает тайм-аут

TimeoutError: [WinError 10060] A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond 

В предыдущих situtations, как это я хотел бы использовать что-то как это

try: 
      do something 
     except KeyError: 
      do something else 

Могу ли я сделать то же самое в этом же situtation т.е.

try: 
       do something 
      except TimeoutError: 
       do something again 

и если да, то что бы я сделал после исключения TimeoutError? я бы снова сделал ту же команду?

ответ

11

Could I do the same thing in this same situtation

Да! Вы можете использовать try/except для любое исключение, а TimeoutError ничего особенного.

and if so what would I do after the except TimeoutError? would I just do the same command again?

Если вы хотите, чтобы повторить один раз, и пусть перекличку второй тайм-аут как реальная ошибка, да:

try: 
    do something 
except TimeoutError: 
    do something 

(Если «сделать что-то» больше, чем простое утверждение, вы, вероятно, хочу то, из кода, так что вы не повторить себя)

Однако, если вы хотите повторить несколько раз, вы, вероятно, хотите цикл:.

for _ in range(max_retries): 
    try: 
     do something 
     break 
    except TimeoutError: 
     pass 

Возможно, вы захотите добавить else пункт for, чтобы отличить два случая (успешно, и сделал break, против никогда не преуспевал и просто закончился из попыток).

+0

Спасибо за объяснение, приятно и просто! – ark

5

Вы можете поймать TimeoutError как вы упомянули:

import socket 
import sys 
try: 
    dosomething() 
except socket.TimeoutError: 
    print >> sys.stderr, 'Retrying after TimeoutError' 
    dosomething() 

Вы можете также использовать retry decorator pattern на функцию:

@retry(socket.TimeoutError) 
def dosomething(): 
    # code that causes a TimeoutError 
    ... 
+1

+1 Я не был осведомлен о 'retry' декоратора. – HennyH

+0

Этот декоратор, вероятно, будет излишним ... и когда это не так, вам может понадобиться что-то немного другое ... но в этом случае исходный код, безусловно, дает хороший пример, который вы можете адаптировать к вашим потребностям. – abarnert

+0

уверен, что это может быть излишним, но это инструмент общего назначения, который должен быть в каждой панели инструментов программиста Python. – jterrace

1
def f(): 
    pass #insert code here 

Повторить один раз после ошибки:

try: 
    f() 
except TimeoutError: 
    f() 

Или петли до успеха:

while True: 
    try: 
     f() 
     break 
    except TimeoutError: 
     pass 

Или с ограниченным числом:

attempts = 3 
while attempts: 
    try: 
     f() 
     break 
    except TimeoutError: 
     attempts -= 1 
+0

Зачем использовать цикл while, как последний, когда будет выполняться простой 'for'? – abarnert

+0

@abarnert хорошее предложение, хотя с ограниченными попытками @ jterrace 'retry' декоратор гораздо приятнее. – HennyH

+0

Декоратор также сильно отличается. Он явно спит между попытками и экспоненциально расширяется во сне. Если вы просто хотите попробовать 3 раза подряд, определенно не используйте его. – abarnert

0

Пожалуйста, запустите каждый пример, они готовы!

Пример 1

import sys 

try: 
    incorrect.syntaxThatIJustMadeUP() 
except: 
    print((sys.exc_info()[0])) #Now you know what to except and CATCH 
else: 
    print("You will never see this message") 

Пример 2

import sys 

try: 
    incorrect.syntaxThatIJustMadeUP() 
except NameError: 
    print("There is a problem with your SYNTAX Dude!") 
except: 
    print((sys.exc_info()[0])) #Incase another uncontrollable network problem occurs, User rages-Snaps IJ45 
else: 
    print("You will never see this message unless TRY suceeds") 
    print("Why not put this try in a loop") 
Смежные вопросы