120 votes

En Python, essayez jusqu'à ce qu'il n'y ait pas d'erreur

J'ai un morceau de code en Python qui semble provoquer une erreur de manière probabiliste car il accède à un serveur et parfois ce serveur a une erreur de serveur interne 500. Je veux continuer à essayer jusqu'à ce que je n'obtienne pas l'erreur. Ma solution était :

 while True:
    try:
        #code with possible error
    except:
         continue
    else:
         #the rest of the code
         break

Cela me semble être un hack. Existe-t-il un moyen plus Pythonic de le faire?

57voto

radtek Points 506

En voici un qui échoue durement après 4 tentatives, et attend 2 secondes entre les tentatives. Modifiez comme vous le souhaitez pour obtenir ce que vous voulez de celui-ci :

 from time import sleep

for x in range(0, 4):  # try 4 times
    try:
        # msg.send()
        # put your logic here
        str_error = None
    except Exception as str_error:
        pass

    if str_error:
        sleep(2)  # wait for 2 seconds before trying to fetch the data again
    else:
        break

Voici un exemple avec backoff :

 from time import sleep

sleep_time = 2
num_retries = 4
for x in range(0, num_retries):  
    try:
        # put your logic here
        str_error = None
    except Exception as str_error:
        pass

    if str_error:
        sleep(sleep_time)  # wait before trying to fetch the data again
        sleep_time *= 2  # Implement your backoff algorithm here i.e. exponential backoff
    else:
        break

29voto

mouad Points 21520

Peut-être quelque chose comme ça :

 connected = False

while not connected:
    try:
        try_connect()
        connected = True
    except ...:
        pass

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X