0
votes

En python, comment puis-je réorganiser une fonction si elle jette une erreur?

Ci-dessous sont des extraits de mes codes, ce que je voulais savoir, c'est hypothétiquement si la fonction Main2 () jette une erreur pour une raison quelconque, comment puis-je obtenir mon exception pour exécuter à nouveau la même fonction dire 3 fois avant que cela ne se casse pas? < P> Juste pour ajouter ici, toutes les fonctions pourraient également lancer une erreur (pas seulement Main2 ()), je n'aurais peut-être pas que 3 mais beaucoup plus de fonctions xxx


0 commentaires

5 Réponses :


1
votes

Voici un idiome que vous pouvez essayer:

for _ in range(3):  # try 3 times
    try:
        main2()
        break       # as soon as it works, break out of the loop
    except Exception as e:
        print e
        continue    # otherwise, try again
else:               # if the loop exited normally, e.g. if all 3 attempts failed
    pass
    # do_something...


2 commentaires

Merci, je pense que ce dont j'ai besoin ici, c'est la possibilité que toutes les trois fonctions puissent lancer une erreur (pas seulement Main2 ()). et tbh honnête je pourrais avoir encore plus de fonctions au fil du temps alors comment cela fonctionnerait-il?


Avoir un différent ESSAYER / sauf Fixture pour chacun d'eux? Cela dépend de vos trois fonctions et de la manière dont ils se connectent les uns avec les autres. Une chose que vous pourriez faire est de faire cela dans une fonction où vous passez dans n nombre de fois pour essayer et MAIN2 la fonction à exécuter, puis appelez cette fonction sur tout ce que fonction que vous voulez exécuter. Ce qui vous permettrait de l'exécuter plus concis.



1
votes

Vous pouvez le faire avec décorateur de Python Réessayer

error_counter = 0
    def main2():
       try:
          np.load('File2.csv')
       except:
          if error_counter < 3
             error_counter += 1
             main2()
          raise Exception("Will not try again, have tried 3 times")  
       error_counter = 0


3 commentaires

Merci je viens de modifier ma question initiale. Ce n'est pas seulement Main2 () qui pourrait lancer comme une erreur c'était un exemple hypothétique. Toute des 3 fonctions pourrait lancer une erreur et TBH très probablement j'aurai probablement 6-7 fonctions. Donc, j'aurais besoin de flexibilité pour réexécuter la fonction qui lance une erreur


Vous pouvez utiliser le décorateur au-dessus de chaque fonction qui en a besoin et spécifier l'exception que vous souhaitez cache. J'ai seulement inclus Main2 comme exemple basé sur la question initiale.


Cela semble travailler pour moi, je vais devoir le tester un peu plus mais semble bon jusqu'à présent. Merci Agian.



0
votes

Vous pouvez essayer xxx

ce code exécutera la fonction MAIN2 () jusqu'à ce qu'il obtiendra 3 erreurs et sur le premier 2, il fera la course à nouveau sur la boucle .


0 commentaires

0
votes

Vous devez gérer toutes les erreurs dans des fonctions spécifiques, sinon si vous manipulez des erreurs de toutes les fonctions ensemble, la fonction à venir avant d'autres fonctions jettera une erreur et que le contrôle exécutera le reste du code à l'exception du code ci-dessous dans la essayez de bloquer. Essayez-le vous-même:

def main():
    # np.load('File.csv')
    raise ValueError
    print("In main")

def main1():
    # np.load('File1.csv')
    raise ValueError
    print("In main1")

def main2():
    # np.load('File2.csv')
    raise ValueError
    print("In main2")

for i in range(1, 10):
    try:
        main()
        main2()
        main3()
    except Exception as e:
        print(e)
    else:
        break


0 commentaires

1
votes

Malheureusement, la mise en œuvre d'un décorateur code> TetRey Code> peut souvent être un peu douloureux. Si vous voulez modifier leur logique ou les ajuster, cela peut être assez compliqué assez rapidement. Il y a une bibliothèque python sur une bibliothèque python appelée backoff-utils strong> qui prend en charge très Stratégies robustes et facilement extensibles (divulgation complète: je suis biaisé, car je suis l'auteur de cette bibliothèque).

Dans votre question hypothétique, vous pouvez utiliser la bibliothèque dans une stratégie de décorateur: xxx pré>

ou vous pouvez l'utiliser dans une stratégie basée sur la fonction lors de l'appelant MAIN2 () CODE>: P>

result = backoff(main2,
                 max_tries = 3,
                 catch_exceptions = [type(ValueError)],
                 strategy = strategies.Fixed)


0 commentaires