Quelle est l'utilisation prévue de la else
clause facultative de la try
déclaration?
python
exception-handling
geowa4
la source
la source
Réponses:
Les instructions du
else
bloc sont exécutées si l'exécution tombe du bas de latry
- s'il n'y a pas eu d'exception. Honnêtement, je n'ai jamais trouvé de besoin.Cependant, la note relative aux exceptions de gestion :
Donc, si vous avez une méthode qui pourrait, par exemple, lancer un
IOError
, et que vous voulez intercepter les exceptions qu'elle déclenche, mais il y a autre chose que vous voulez faire si la première opération réussit, et vous ne voulez pas intercepter une IOError à partir de cette opération, vous pourriez écrire quelque chose comme ceci:Si vous venez de mettre
another_operation_that_can_throw_ioerror()
aprèsoperation_that_can_throw_ioerror
, laexcept
capture les erreurs du deuxième appel. Et si vous le mettez après tout letry
bloc, il sera toujours exécuté, et pas avant lefinally
. Leelse
vous permet de vous assurerfinally
bloc, etIOError
qu'il soulève ne sont pas pris icila source
return
,continue
oubreak
.Il y a une grande raison d'utiliser
else
- le style et la lisibilité. C'est généralement une bonne idée de conserver le code qui peut provoquer des exceptions près du code qui les traite. Par exemple, comparez-les:et
Le second est bon lorsque le
except
ne peut pas revenir plus tôt ou relancer l'exception. Si possible, j'aurais écrit:Remarque: réponse copiée à partir du double récemment publié ici , d'où toutes ces choses "AskPassword".
la source
Une seule utilisation: tester du code qui devrait déclencher une exception.
(Ce code devrait être résumé dans un test plus générique dans la pratique.)
la source
L'utilisation prévue est d'avoir un contexte pour plus de code à exécuter s'il n'y avait aucune exception où il était censé être géré.
Ce contexte évite de gérer accidentellement des erreurs auxquelles vous ne vous attendiez pas.
Mais il est important de comprendre les conditions précises qui causent la clause d' autre à courir, parce que
return
,continue
etbreak
peut interrompre le flux de commandeelse
.En résumé
La
else
déclaration va s'il n'y a pas d' exceptions et sinon interrompu par unreturn
,continue
oubreak
déclaration.Les autres réponses manquent cette dernière partie.
De la documentation:
(Les caractères gras sont ajoutés.) Et la note de bas de page se lit comme suit:
Il nécessite au moins une clause except précédente ( voir la grammaire ). Donc ce n'est vraiment pas "try-else", c'est "try-except-else (-finally)", le
else
(etfinally
) étant optionnel.Le didacticiel Python détaille l'utilisation prévue:
Exemple de différenciation
else
par rapport au code suivant letry
blocSi vous gérez une erreur, le
else
bloc ne s'exécutera pas. Par exemple:Et maintenant,
la source
Try-except-else est idéal pour combiner le modèle EAFP avec la frappe de canard :
Vous pourriez penser que ce code naïf est très bien:
C'est un excellent moyen de masquer accidentellement de graves bogues dans votre code. J'ai typé le nettoyage là-bas, mais l'attributError qui me ferait savoir est avalé. Pire, que se serait-il passé si je l'avais écrit correctement, mais que la méthode de nettoyage était parfois transmise à un type d'utilisateur qui avait un attribut mal nommé, ce qui lui faisait échouer silencieusement à mi-chemin et laisser un fichier non fermé? Bonne chance pour déboguer celui-là.
la source
Je trouve cela très utile lorsque vous avez du nettoyage à faire, cela doit être fait même s'il y a une exception:
la source
Même si vous ne pouvez pas penser à une utilisation en ce moment, vous pouvez parier qu'il doit y avoir une utilisation. Voici un exemple sans imagination:
Avec
else
:Sans
else
:Ici, vous avez
something
défini la variable si aucune erreur n'est levée. Vous pouvez supprimer cela en dehors dutry
bloc, mais cela nécessite une détection compliquée si une variable est définie.la source
something = a[2]; print something
intérieur du bloc try:?Il y a un bel exemple de
try-else
au PEP 380 . Fondamentalement, cela revient à faire une gestion des exceptions différente dans différentes parties de l'algorithme.C'est quelque chose comme ça:
Cela vous permet d'écrire le code de gestion des exceptions plus près de l'endroit où l'exception se produit.
la source
Des erreurs et des exceptions # Gestion des exceptions - docs.python.org
la source
En regardant la référence Python, il semble qu'il
else
soit exécuté aprèstry
qu'il n'y ait pas d'exception. La clause else facultative est exécutée si et quand le contrôle découle de la fin de la clause try. 2 Les exceptions de la clause else ne sont pas gérées par les clauses except précédentes.Plongez dans python a un exemple où, si je comprends bien, en
try
bloc, ils essaient d'importer un module, lorsque cela échoue, vous obtenez une exception et liez par défaut, mais quand cela fonctionne, vous avez une option pour entrer danselse
bloc et lier ce qui est requis (voir lien pour l'exemple et l'explication).Si vous avez essayé de travailler en
catch
bloc, cela pourrait déclencher une autre exception - je suppose que c'est là que leelse
bloc est pratique.la source
try
bloc.C'est ça. Le bloc «else» d'une clause try-except existe pour le code qui s'exécute lorsque (et uniquement lorsque) l'opération tentée réussit. Il peut être utilisé et abusé.
Personnellement, je l'aime et je l'utilise quand c'est approprié. Il regroupe sémantiquement les instructions.
la source
Peut-être qu'une utilisation pourrait être:
Peut-être que cela vous mènera aussi à une utilisation.
la source
J'ai trouvé la
try: ... else:
construction utile dans la situation où vous exécutez des requêtes de base de données et enregistrez les résultats de ces requêtes dans une base de données distincte du même type / type. Disons que j'ai beaucoup de threads de travail traitant toutes les requêtes de base de données soumises à une file d'attenteBien sûr, si vous pouvez distinguer les exceptions possibles qui peuvent être levées, vous n'êtes pas obligé de l'utiliser, mais si le code réagissant à un morceau de code réussi peut lever la même exception que le morceau réussi, et vous ne pouvez pas simplement laissez la deuxième exception possible disparaître, ou revenez immédiatement en cas de succès (ce qui tuerait le thread dans mon cas), alors cela est pratique.
la source
Un
else
bloc peut souvent exister pour compléter la fonctionnalité qui se produit dans chaqueexcept
bloc.Dans ce cas,
inconsistency_type
est défini dans chaque bloc sauf, de sorte que le comportement est complété dans le cas sans erreur deelse
.Bien sûr, je décris cela comme un modèle qui peut apparaître un jour dans votre propre code. Dans ce cas spécifique, vous venez de mettre
inconsistency_type
à 0 avant letry
blocage de toute façon.la source
Voici un autre endroit où j'aime utiliser ce modèle:
la source
continue
place - le modèle «sortir tôt». Cela vous permet de supprimer la clause "else" et son retrait, ce qui facilite la lecture du code.L'un des scénarios d'utilisation auxquels je peux penser est celui des exceptions imprévisibles, qui peuvent être contournées si vous essayez à nouveau. Par exemple, lorsque les opérations dans le bloc try impliquent des nombres aléatoires:
Mais si l'exception peut être prédite, vous devez toujours choisir la validation au préalable sur une exception. Cependant, tout n'est pas prévisible, donc ce modèle de code a sa place.
la source
break
intérieurtry
à la fin, ce qui est plus propre à l'OMI, et vous n'en avez pas besoinelse
. De plus, cecontinue
n'est pas vraiment nécessaire, vous pouvez simplementpass
.J'ai trouvé
else
utile de traiter un fichier de configuration éventuellement incorrect:Une exception lors de la lecture de la
lock
configuration désactive la surveillance des verrous et ValueErrors enregistre un message d'avertissement utile.la source
Supposons que votre logique de programmation dépend si un dictionnaire a une entrée avec une clé donnée. Vous pouvez tester le résultat de l'
dict.get(key)
utilisation de laif... else...
construction, ou vous pouvez faire:la source
J'ajouterais un autre cas d'utilisation qui semble simple lors de la gestion des sessions DB:
la source
Le
else:
bloc est déroutant et (presque) inutile. Cela fait également partie des déclarationsfor
etwhile
.En fait, même sur une
if
déclaration, leelse:
peut être abusé de manière vraiment terrible, créant des bogues très difficiles à trouver.Considère ceci.
Réfléchissez bien
else:
. C'est généralement un problème. Évitez-le, sauf dans uneif
déclaration, et envisagez même de documenter laelse
condition - pour la rendre explicite.la source
if x > 0: return "yes"
etif x <= 0: return "no"
. Maintenant, une personne vient et change l'une des conditions pour direx > 1
mais oublie de changer l'autre. Comment cela réduit-il le nombre de bogues qui seraient commis?if else
les clauses sont parfois séparées de plusieurs lignes. DRY est une bonne pratique, beaucoup plus souvent qu'autrement, vraiment. (Pardonnez moi pour ce double commentaire).