2017-09-25 1 views
0

Pour mon application, j'utilise l'interface python pour lire les registres d'un microcontrôleur. Parfois, la lecture échoue et provoque une exception. Idéalement, ce que je voudrais faire est une exception, je voudrais revenir à la même ligne qui avait une exception et le refaire. Cela signifie essentiellement revenir à la déclaration qui a échoué à la lecture d'un registre. Je peux pour une seule lecture faire ce qui suit:En Python sur les exceptions, comment refaire la ligne qui a provoqué l'exception

while ReadSuccess == 0: 
    try: 
    readregister(); 
    faultReadSuccess = 1 
    except (KeyboardInterrupt, SystemExit): 
    print "Program manually stopped through Ctrl-C" 
    raise 
    except: 
    faultReadSuccess = 0 
    print "Reading failure" 
    time.sleep(.5) 

Ceci essentiellement sur une seule lecture ne fait que répéter la lecture jusqu'à ce qu'il passe. Cependant, j'ai plusieurs commandes de lecture de registre dispersées dans mon programme et ce sont des lectures sensibles au débit, et je ne peux pas commencer au début du code ou une section de code avec les lectures à travers une boucle while ou quelque chose. Au contraire, si une lecture échoue, je dois directement refaire cette relecture jusqu'à ce qu'elle passe, puis continuer.

Cependant, je ne sais pas comment le faire sans pour chaque lecture individuelle, faites le code mentionné ci-dessus. J'ai essayé de chercher un "saut à"/"aller à" l'équivalent de la ligne précédente, mais je ne trouve rien. Y a-t-il quelque chose qui me permettrait de faire une exception en répétant simplement la ligne qui a échoué?

+1

Écrivez une fonction pour exécuter la boucle de lecture et appelez la fonction. – user2357112

Répondre

1

Je vous suggère de créer une nouvelle fonction pour relancer l'read_register(), et passez un paramètre pour contrôler le nombre de fois que vous souhaitez recommencez. Par exemple, pour définir une fonction comme:

def read_retry(read_reg, n): 
""" 
"read_reg" is one of your read_register functions; 
"n" is the retry times. 
""" 
    i = 0 # i is the counter 
    while i < n: 
     try: 
      read_reg() 
      break # if success, then exit the loop 
     except:    
      print "Reading failure for {} time(s)".format(i+1) 
      time.sleep(0.5) 
      i = i + 1 

Dites, vous voulez réessayer read_register_1() 3 fois. Appelez simplement le read_retry(read_register_1, 3).

+0

Merci pour la réponse claire et rapide @Quinn. C'est une bonne solution et permet d'économiser beaucoup de code supplémentaire. J'apprécie beaucoup –

0

de sorte que vous aurez à faire quelque chose comme ceci:

while True: 
    try: 
    read_register_1() 
    except: 
    time.sleep(0.5) 
    else: 
    break 

while True: 
    try: 
    read_register_2() 
    except: 
    time.sleep(0.5) 
    else: 
    break