web-dev-qa-db-fra.com

Plusieurs codes d'essai dans un 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

Est-ce que quelque chose comme ça est possible?

50
arvidurs

Vous devrez faire ceci séparer 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 avez besoin de courir code c quel que soit , vous devez placer les blocs try 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 d'ignorer aveuglément toutes les exceptions. Vous ignorerez également MemoryError, KeyboardInterrupt et SystemExit, ce que vous ne voudriez normalement pas ignorer ou intercepter sans une sorte de ré-relance ou de raison consciente. gérer ceux-ci.

68
Martijn Pieters

Vous pouvez utiliser le module fuckit .
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
11
Mostafa Bahri

Extrait (refactor) vos déclarations. Et utilisez la magie de and et 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
6
Inbar Rose

Si vous ne souhaitez pas enchaîner (un grand nombre de) clauses try-except, vous pouvez essayer vos codes en boucle et rompre dès le premier succès.

Exemple avec des codes pouvant être mis en 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 (instructions) 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)
3
kxr