129 votes

Attraper une exception et continuer le bloc d'essai en Python

Puis-je retourner à l'exécution du bloc try après qu'une exception se soit produite?

Par exemple:

try:
    do_smth1()
except:
    pass

try:
    do_smth2()
except:
    pass

contre.

try:
    do_smth1()
    do_smth2()
except:
    ??? # mot magique pour passer à do_smth2() s'il y avait une exception dans do_smth1

149voto

Non, vous ne pouvez pas faire ça. C'est simplement la façon dont Python a sa syntaxe. Une fois que vous sortez d'un bloc try à cause d'une exception, il n'y a pas de retour en arrière possible.

Et pour une boucle for ?

funcs = do_smth1, do_smth2

for func in funcs:
    try:
        func()
    except Exception:
        pass  # ou vous pourriez utiliser 'continue'

Notez cependant qu'il est considéré comme une mauvaise pratique d'avoir un except nu. Vous devriez attraper une exception spécifique à la place. J'ai capturé Exception car c'est aussi bien que je peux le faire sans savoir quelles exceptions les méthodes pourraient lancer.

49voto

pankaj Points 1220

Alors que les autres réponses et celle acceptée sont correctes et doivent être suivies dans du code réel, juste pour la complétude et l'humour, vous pouvez essayer le module fuckitpy ( https://github.com/ajalt/fuckitpy ).

Votre code peut être modifié comme suit:

@fuckitpy
def myfunc():
    do_smth1()
    do_smth2()

Ensuite, appeler myfunc() appellerait do_smth2() même s'il y a une exception dans do_smth1()

Note: S'il vous plaît ne pas essayer dans un vrai code, c'est un blasphème

26voto

Lucas Ribeiro Points 1014

Vous pouvez accomplir ce que vous voulez, mais avec une syntaxe différente. Vous pouvez utiliser un bloc "finally" après le try/except. De cette manière, Python exécutera le bloc de code quelle que soit l'exception soit lancée ou non.

Comme ceci :

try:
    do_smth1()
except:
    pass
finally:
    do_smth2()

Mais, si vous voulez exécuter do_smth2() seulement si l'exception n'a pas été lancée, utilisez un bloc "else" :

try:
    do_smth1()
except:
    pass
else:
    do_smth2()

Vous pouvez également les combiner dans une clause try/except/else/finally. Amusez-vous bien !

17voto

LIU ZHIWEN Points 13

'continue' est autorisé uniquement dans une clause 'except' ou 'finally' si le bloc try est dans une boucle. 'continue' provoquera la prochaine itération de la boucle.

Vous pouvez donc essayer de mettre vos deux fonctions ou plus dans une liste et utiliser une boucle pour appeler votre fonction.

Comme ceci:

funcs = [f,g]
for func in funcs:
    try: func()
    except: continue

Pour obtenir des informations complètes, vous pouvez suivre ce lien

9voto

David Neale Points 8596

Vous pourriez itérer à travers vos méthodes...

for m in [do_smth1, do_smth2]:
    try:
        m()
    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