28 votes

Que soulève Python?

Considérez le code suivant:

 try:
    raise Exception("a")
except:
    try:
        raise Exception("b")
    finally:
        raise
 

Cela augmentera Exception: a . Je m'attendais à ce qu'il augmente de Exception: b (dois-je expliquer pourquoi?). Pourquoi le raise final lève l'exception d'origine plutôt que (ce que je pensais) la dernière exception a été levée?

24voto

Falmarri Points 20281

Relancer, c'est relancer la dernière exception que vous avez interceptée, pas la dernière exception que vous avez déclenchée

(republié des commentaires pour plus de clarté)

14voto

pyfunc Points 31088

Sur python2.6

Je suppose que, vous attendez le bloc finally pour être à égalité avec les "essayer" bloc où vous soulever l'exception "B". Le bloc finally est attachée à la première "d'essayer" de bloc.

Si vous avez ajouté une exception à bloc à l'intérieur du bloc try, le bloc finally sera raise exception B.

try:
  raise Exception("a")
except:
  try:
    raise Exception("b")
  except:
    pass
  finally:
    raise

Sortie:

Traceback (most recent call last):
  File "test.py", line 5, in <module>
    raise Exception("b")
Exception: b

Une autre variation qui explique ce qui se passe ici

try:
  raise Exception("a")
except:
  try:
    raise Exception("b")
  except:
    raise

Sortie:

Traceback (most recent call last):
  File "test.py", line 7, in <module>
    raise Exception("b")
Exception: b

Si vous voyez ici, en remplaçant le bloc finally, sauf soulève l'exception de B.

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