112 votes

Plusieurs codes d'essai dans un seul bloc

J'ai un problème avec mon code dans le bloc try. Pour faciliter les choses, voici mon code :

try:
    code a
    code b #if b fails, it should ignore, and go to c.
    code c #if c fails, go to d
    code d
except:
    pass

Une telle chose est-elle possible ?

166voto

Martijn Pieters Points 271458

Tu dois faire ça séparé try blocs :

try:
    code a
except ExplicitException:
    pass

try:
    code b
except ExplicitException:
    try:
        code c
    except ExplicitException:
        try:
            code d
        except ExplicitException:
            pass

Cela suppose que vous voulez exécuter code c seulement si code b échoué.

Si vous devez exécuter code c indépendamment de vous devez mettre le try blocs l'un après l'autre :

try:
    code a
except ExplicitException:
    pass

try:
    code b
except ExplicitException:
    pass

try:
    code c
except ExplicitException:
    pass

try:
    code d
except ExplicitException:
    pass

J'utilise except ExplicitException ici parce que c'est jamais une bonne pratique pour ignorer aveuglément toutes les exceptions. Vous ignorerez MemoryError , KeyboardInterrupt y SystemExit ainsi que d'autres, que vous ne voulez normalement pas ignorer ou intercepter sans une sorte de relance ou une raison consciente pour les traiter.

42voto

Mostafa Bahri Points 178

Vous pouvez utiliser fuckit module.
Enveloppez votre code dans une fonction avec @fuckit décorateur :

@fuckit
def func():
    code a
    code b #if b fails, it should ignore, and go to c.
    code c #if c fails, go to d
    code d

16voto

Inbar Rose Points 13033

Extraire (remanier) vos déclarations. Et utilisez la magie de and y or pour décider quand court-circuiter.

def a():
    try: # a code
    except: pass # or raise
    else: return True

def b():
    try: # b code
    except: pass # or raise
    else: return True

def c():
    try: # c code
    except: pass # or raise
    else: return True

def d():
    try: # d code
    except: pass # or raise
    else: return True

def main():   
    try:
        a() and b() or c() or d()
    except:
        pass

6voto

kxr Points 31

Si vous ne voulez pas enchaîner (un grand nombre) de clauses try-except, vous pouvez essayer vos codes dans une boucle et vous arrêter au premier succès.

Exemple avec des codes qui peuvent être mis dans des fonctions :

for code in (
    lambda: a / b,
    lambda: a / (b + 1),
    lambda: a / (b + 2),
    ):
    try: print(code())
    except Exception as ev: continue
    break
else:
    print("it failed: %s" % ev)

Exemple avec des codes arbitraires (déclarations) directement dans la portée actuelle :

for i in 2, 1, 0:
    try:
        if   i == 2: print(a / b)
        elif i == 1: print(a / (b + 1))
        elif i == 0: print(a / (b + 2))
        break        
    except Exception as ev:
        if i:
            continue
        print("it failed: %s" % ev)

4voto

ZF007 Points 1624

Disons que chaque code est une fonction et qu'il a déjà été écrit, alors ce qui suit peut être utilisé pour parcourir votre liste de codage et sortir de la boucle for lorsqu'une fonction est exécutée sans erreur en utilisant le "break".

def a(): code a
def b(): code b
def c(): code c
def d(): code d

for func in [a, b, c, d]:  # change list order to change execution order.
   try:
       func()
       break
   except Exception as err:
       print (err)
       continue

J'ai utilisé "Exception" ici pour que vous puissiez voir toute erreur imprimée. Désactivez l'impression si vous savez à quoi vous attendre et que vous ne vous en souciez pas (par exemple, si le code renvoie deux ou trois éléments de liste (i,j = msg.split('.')).

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