Les déclarations dans le else
sont exécutés si l'exécution tombe en bas du try
- s'il n'y avait pas d'exception. Honnêtement, je n'en ai jamais trouvé le besoin.
Cependant, Traitement des exceptions notes :
L'utilisation de la clause else est préférable que l'ajout de code supplémentaire à la clause try car elle évite d'attraper accidentellement accidentellement une exception qui n'a pas été levée par le code protégé par la clause l'instruction try ... except.
Donc, si vous avez une méthode qui pourrait, par exemple, lancer un IOError
et vous voulez attraper les exceptions qu'elle soulève, mais il y a autre chose que vous voulez faire si la première opération réussit, et vous Ne le fais pas. si vous voulez attraper une erreur IOError lors de cette opération, vous pouvez écrire quelque chose comme ceci :
try:
operation_that_can_throw_ioerror()
except IOError:
handle_the_exception_somehow()
else:
# we don't want to catch the IOError if it's raised
another_operation_that_can_throw_ioerror()
finally:
something_we_always_need_to_do()
Si vous mettez juste another_operation_that_can_throw_ioerror()
après operation_that_can_throw_ioerror
le except
rattraperait les erreurs du second appel. Et si vous le mettez après tout le try
il sera toujours exécuté, et pas avant que le bloc finally
. Le site else
vous permet de vous assurer
- la seconde opération n'est exécutée que s'il n'y a pas d'exception,
- il est exécuté avant le
finally
le bloc, et
- tout
IOError
qu'il soulève ne sont pas prises ici
3 votes
La plupart des réponses semblent se concentrer sur la raison pour laquelle nous ne pouvons pas simplement mettre le matériel dans la clause else dans la clause try elle-même. La question stackoverflow.com/questions/3996329 demande spécifiquement pourquoi le code de la clause else ne peut pas aller après le bloc try lui-même, et cette question est doublée de celle-ci, mais je ne vois pas de réponse claire à cette question ici. Je pense que stackoverflow.com/a/3996378/1503120 répond parfaitement à cette question. J'ai également essayé d'élucider les différentes significations des différentes clauses à stackoverflow.com/a/22579805/1503120 .
2 votes
Vous voulez que quelque chose se produise si l'exception ne se déclenche pas, avant le nettoyage final, qui n'est jamais censé déclencher lui-même le même traitement de l'exception.
0 votes
Après avoir oublié ce que
else
fait danstry/else
yfor/else
de nombreuses fois, je l'ai mentalement aliasé avecnoexcept
ynobreak
dans ces contextes respectifs. Personnellement, je trouve qu'il s'agit d'une surcharge si malheureuse du mot que j'essaie d'éviter de l'utiliser si je le peux, car cela oblige les personnes qui lisent du code à se demander "à quoi sert cette chose déjà ?". Habituellement, un drapeau, uncontinue
obreak
La déclaration peut relayer ce que j'essaie d'exprimer avec quelques lignes supplémentaires, mais certainement plus de clarté (si la popularité de la question est une indication).