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?
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.
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
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
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)