PEP 341: Unification de try/except/finally
Python 2.5 unifie les deux type de bloc try. Il est maintenant possible d'utiliser des except et un bloc finally ensemble. La sémantique de cette nouvelle construction est simple, quoi qu'il se passe dans le try, dans le ou les except et dans le else, le bloc finally sera toujours exécuté.
Avant Python 2.5, il existait deux façons d'utiliser try. On pouvait utiliser un bloc finally pour s'assurer que le code est toujours exécuté, ou utiliser un ou plusieurs blocs except pour intercepter des exceptions spécifiques. Vous ne pouviez pas combiner ensemble des blocs except et un bloc finally, parce que générer le bon bytecode pour la version combinée était compliqué et la sémantique qui en résulterait n'était pas claire.
Guido van Rossum à passé un peu de temps avec Java, qui supporte l'équivalent d'une combinaison de blocs except et d'un bloc finally, et la sémantique de l'opération fut clarifiée. Dans Python 2.5, vous pouvez maintenant écrire :
try:
bloc-1 ...
except Exception1:
gestionnaire-1 ...
except Exception2:
gestionnaire-2 ...
else:
bloc-else
finally:
bloc-final.
Le code du bloc-1 est exécuté. Si le code lève une exception, les différents blocs except sont testés : si l'exception appartient à la classe Exception1, le gestionnaire-1 est exécuté; dans le cas d'une exception de type Exception2, le gestionnaire-2 est exécuté, et ainsi de suite. Si aucune exception n'est levée, le bloc-else est exécuté.
Peu importe ce qui s'est passé précédemment, le bloc-final sera exécuté. Même si une erreur est générée dans un gestionnaire d'exception ou dans le bloc-else, et qu'une nouvelle exception est levée, le code dans final-bloc sera quand même exécuté.

