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 p>
5 Réponses :
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...
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 CODE> /
sauf CODE> 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 code> nombre de fois pour essayer et
MAIN2 code> 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.
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
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.
Vous pouvez essayer ce code exécutera la fonction MAIN2 () code> jusqu'à ce qu'il obtiendra 3 erreurs et sur le premier 2, il fera la course à nouveau sur la boucle . p> p>
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
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 Dans votre question hypothétique, vous pouvez utiliser la bibliothèque dans une stratégie de décorateur: 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)