Python essayer autre chose
Qu'est-ce que l'utilisation prévue de l'option else
de la clause de la try
déclaration?
Vous devez vous connecter pour publier un commentaire.
Qu'est-ce que l'utilisation prévue de l'option else
de la clause de la try
déclaration?
Vous devez vous connecter pour publier un commentaire.
Les déclarations dans la
else
bloc sont exécutées si l'exécution se décolle du fond de latry
- si il n'y a pas d'exception. Honnêtement, je n'ai jamais trouvé un besoin.Cependant, La Gestion Des Exceptions notes:
Donc, si vous avez une méthode qui pourrait, par exemple, jeter 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 pas veulent attraper un IOError de cette opération, vous pouvez écrire quelque chose comme ceci:Si vous venez de mettre
another_operation_that_can_throw_ioerror()
aprèsoperation_that_can_throw_ioerror
, leexcept
serait prendre le second appel à des erreurs. Et si vous le mettez, après touttry
bloc, il va toujours être exécuté, et n'est qu'après lafinally
. Leelse
vous permet de vous assurerfinally
bloc, etIOError
s il soulève ne sont pas pris icielse
est très utile.return
,continue
oubreak
.else
bloc sera pris. Considérez ceci...try: x = 0
except: print('foo')
else: y = 1/0
finally: print('bar')
Est-il un moyen de supprimer la division par zéro?try:
user = User.objects.get(email=email)
except User.DoesNotExist:
user = User.objects.create_user(username=username, email=email, password=password)
else:
agent = Agent.objects.get(user=user) agent.is_active = True agent.save()
else:
pour le journal de l'exécution réussie dans moninfo.log
fichier.Il y en a un grand raison de l'utilisation d'
else
de style et de lisibilité. C'est généralement une bonne idée de garder un code qui peut causer des exceptions près le code qui traite avec eux. Par exemple, de comparer ces:et
La deuxième une seule est bonne quand la
except
ne peut pas revenir plus tôt, ou renvoyer l'exception. Si possible, j'aurais écrit:Remarque: Réponse copié à partir de récemment posté en double ici, donc tout ce "AskPassword" choses".
Une utilisation: test de code qui devrait lever une exception.
(Ce code doit être placé dans un plus générique de test dans la pratique.)
L'utilisation prévue est d'avoir un contexte pour les plus de code à exécuter si il n'y a pas d'exceptions, où il était attendu à être manipulés.
Ce contexte évite accidentellement les erreurs de manipulation que vous n'attendiez pas.
Mais il est important de comprendre les conditions précises qui cause la clause else, car
return
,continue
, etbreak
peut interrompre le flux de contrôle pourelse
.En Résumé
La
else
instruction s'exécute si il y a pas exceptions et si elle n'est pas interrompu par unreturn
,continue
, oubreak
déclaration.Autres réponses manquer la dernière partie.
À partir de la documentation:
(Caractères gras ajoutés.) Et la note de bas de page se lit comme suit:
Il exige la présence d'au moins un précédent, à l'exception de l'alinéa (voir la grammaire). Donc, ce n'est vraiment pas "essayer autre chose," il est "try-except-d'autre (enfin)," avec le
else
(etfinally
) étant en option.La Tutoriel Python donne des précisions sur l'utilisation prévue:
Exemple de différenciation
else
contre le code suivant letry
blocSi vous gérer une erreur, le
else
bloc ne sera pas exécuté. Par exemple:Et maintenant,
else
bloc plutôt que de faire un dump de la code dans letry
bloc.Essayez-sauf-le reste est idéal pour combiner le modèle de l'aeap avec en tapant duck:
Vous pourriez chose de cette naïve code est très bien:
C'est un excellent moyen de accidentellement cacher de graves failles dans votre code. Je typo-ed nettoyage de là, mais le AttributeError que permettez-moi de le savoir est d'être avalé. Pire, que si j'avais écrit correctement, mais la méthode de nettoyage qui a parfois été passée un type d'utilisateur qui a eu un mal nommée attribut, à l'origine pour échouer en mode silencieux à mi-chemin à travers, et de laisser un fichier ouvert? Bonne chance débogage qu'un.
Je trouve ça vraiment utile lorsque vous avez de nettoyage à faire ce qui doit être fait, même si il y a une exception:
Même si vous ne pouvez pas penser à une utilisation de ce droit maintenant, vous pouvez parier qu'il y a un emploi pour elle. Voici un échantillon d'imagination:
Avec
else
:Sans
else
:Ici, vous avez la variable
something
défini si aucune erreur n'est générée. Vous pouvez le supprimer en dehors de latry
bloc, mais il nécessite un certain désordre de détection si une variable est définie.something = a[2]; print something
à l'intérieur de l'essayer: bloc?De Des erreurs et des Exceptions # gestion des exceptions - docs.python.org
Il y a un bel exemple de
try-else
dans PEP 380. Fondamentalement, il s'agit de faire différentes de gestion des exceptions dans les différentes parties de l'algorithme.C'est quelque chose comme ceci:
Cela permet d'écrire le code de gestion des exceptions plus près à l'endroit où l'exception se produit.
Regardant Python référence il semble que
else
est exécuté aprèstry
quand il n'y a pas d'exception.L'option clause else est exécutée que si et lorsque le contrôle de flux la fin de l'essai, la clause. Deux Exceptions à la clause else ne sont pas gérées par le précédent à l'exception des clauses.
Dive into python a un exemple où, si je comprends bien, en
try
bloc ils essaient d'importer un module, quand cela échoue, vous obtenez exception et se lient par défaut mais quand cela fonctionne, vous avez une option pour aller danselse
bloc et de lier ce qui est requis (voir le lien pour l'exemple et l'explication).Si vous avez essayé de faire du travail en
catch
bloc, il pourrait jeter une autre exception, je pense que c'est là que leelse
bloc vient à portée de main.try
bloc.Que c'est. Le 'else' bloc d'un essai à l'exception de la clause existe pour le code qui s'exécute si (et seulement si) l'a essayé opération réussit. Il peut être utilisé, et il peut être abusé.
Personnellement, je l'aime et l'utiliser au moment opportun. Il sémantiquement groupes d'états.
La plupart des réponses semblent se concentrer sur ce pourquoi nous ne pouvons pas simplement mettre le matériel dans la clause else dans l'essai, la clause elle-même. La question d'autre clause dans l'instruction try... que c'est bon pour le demande précisément pourquoi la clause else code ne peut pas aller après le bloc try lui-même, et la question est dupped à ce point, mais je ne vois pas une réponse claire à cette question ici. Je me sens https://stackoverflow.com/a/3996378/1503120 parfaitement réponses à cette question. J'ai également tenté d'élucider les différents importance des différentes clauses, à l' https://stackoverflow.com/a/22579805/1503120.
Peut-être un usage peut être:
Peut-être ce qui vous mènera aussi à une utilisation.
Un
else
bloc existent souvent pour compléter les fonctionnalités qui se produit dans tous lesexcept
bloc.Dans ce cas,
inconsistency_type
est installé dans chaque bloc except, de sorte que le comportement est complétée en cas d'erreur danselse
.Bien sûr, je suis décrivant comme un modèle qui peut passer dans votre propre code d'un jour. Dans ce cas précis, il suffit de fixer
inconsistency_type
à 0 avant letry
bloc de toute façon.J'ai trouvé le
try: ... else:
construire utile dans la situation où vous exécutez des requêtes de base de données et de journalisation les résultats de ces requêtes à une base de données distincte de la même saveur/type. Disons que j'ai beaucoup de threads de travail de gestion de tous les requêtes de base de données soumis à une file d'attenteBien sûr, si vous pouvez faire la distinction entre les exceptions qui peuvent être levées, vous n'avez pas à l'utiliser, mais si le code de réagir à une réussite de bout de code pourrait jeter de la même exception que le succès de la pièce, et vous ne pouvez pas laisser simplement la deuxième exception possible d'aller ou de revenir immédiatement sur la réussite (qui pourrait tuer le thread dans mon cas), cela ne veut venir dans maniable.
Ici est un autre endroit où je voudrais utiliser ce modèle:
continue
au lieu de la "rupture " tôt" modèle. Cela vous permet de laisser tomber le "else" clause et de sa mise en retrait, rendant le code plus facile à lire.L'un des scénarios d'utilisation, je peux penser à est imprévisible des exceptions, qui peuvent être contournées si vous essayez à nouveau. Par exemple, lorsque les opérations en bloc try implique de nombres aléatoires:
Mais si l'exception peut être prédit de, vous devriez toujours choisir de validation au préalable sur une exception. Cependant, tout ne peut pas être prédit, et ce code motif a sa place.
break
à l'intérieur de latry
à la fin, ce qui est plus propre de l'OMI, et vous n'avez pas besoin de laelse
. Aussi lacontinue
n'est pas vraiment nécessaire, vous pouvez simplementpass
.J'ai trouvé
else
utiles pour traiter avec, éventuellement, un incorrecte de fichier de config:Une exception à la lecture de la
lock
config désactive le verrouillage de surveillance et de ValueErrors journal d'aider, un message d'avertissement.Supposons que votre logique de programmation dépend de savoir si un dictionnaire est une entrée avec une clé donnée. Vous pouvez tester le résultat de
dict.get(key)
à l'aide deif... else...
construire, ou vous pouvez le faire:La
else:
bloc est source de confusion et (presque) inutile. C'est aussi une partie de lafor
etwhile
consolidés.En fait, même sur un
if
-déclaration, leelse:
peut être abusé vraiment terrible des façons de créer des bogues qui sont très difficiles à trouver.En tenir compte.
Réfléchir à deux fois sur
else:
. C'est généralement un problème. L'éviter, sauf dans uneif
-déclaration et même alors envisager de documenter laelse
- condition de la rendre explicite.else
. J'ai lu beaucoup de code. J'ai voir ce beaucoup. Ce qui, exactement -- est vrai pour laelse
? Il est assez difficile de définir correctement?else
de la clause elle-même, mais en raison de la spécificité de la sélection de conditions. Vous pouvez écrire du code bogué en utilisant toutes les constructions que vous voulez assez facilement. Ce n'est pas les constructions à blâmer.else
où pas partie de la langue, alors la logique devrait être tout à fait explicite. Elle permettrait de réduire le bugginess considérablement en éliminant toutes les deviner-le travail sur la partie de vous ou je l'ai essayer et déterminer de laelse
condition de sens que dans l'ensemble de l'algorithme. Il n'y a pas lieu de le deviner ou de déduction.if x > 0: return "yes"
etif x <= 0: return "no"
. Maintenant, une personne vient et les changements de l'une des conditions à-direx > 1
mais oublie de changer l'autre. Comment est-ce que la réduction du nombre de bugs qui pourraient être commis.if else
clauses sont parfois beaucoup de lignes d'intervalle. SEC est une bonne pratique, beaucoup plus souvent que pas, vraiment. (désolé pour le double post).if
etelif
blocs de prouver que l'une des conditions était manquant. Si l'on suppose que laelse
bloc, nous n'avons pas de déclaration claire de l'auteur du dessin original. Notre estimation personnelle. Il est difficile de comparer notre estimation de laelse
condition avec l'auteur, puisque l'auteur nous a laissé aucune trace dans le code.else
clause favorise moins strictes efforts pour tenir compte de toutes les conditions possibles. Cependant je propose aussi qu'il y a peu de vrai génies et, par conséquent, les êtres humains ne manquez conditions, même des génies. Je trouve leelse
clause d'un bel outil de débogage. Si vous avez des superpuissances qui capture toutes les conditions à chaque fois dans votre code, peut-être que vous(personne n'en particulier) peuvent profiter de codage en C++ avec tout ce que la belle puncuation strictes que les programmeurs ne jamais tomber (ou le font-ils?). Donc, mon point est le cas d'utilisation n'est pas sielse
favorise le laisser-aller, mais si elle traite de l'imperfection de l'homme des codeurs.else
et de traiter avec la logique des échecs que l'on peut voir. Personne n'est un génie. Sloppy utilisation deelse
rend encore plus difficile d'être sûr que les choses sont à droite. En évitantelse
met vos erreurs humaines dans votre visage humain de sorte que vous pouvez les corriger. Pas d'espoir que quelque chose de bon qui s'est passé. Le point est d'avoir autant d'outils de débogage (et d'outils de diagnostic et de l'homme-l'imperfection des détections) que possible. Pas de j'espère que les choses vont wok de même, lorsque nous trébuchons.else
clause utilisable outil de débogage. Et je suis d'accord que l'utilisation de laelse
clause dans certains émotionnel j'espère est moins logique, puis "traitement" avec la logique des échecs. Cependant je suis en désaccord avec ce que les imperfections de l'homme, les codes sont trouvés précisément en évitantelse
clauses. C' peut de l'aide, mais il a également peut vous conduire à un faux sentiment que vous avez évité les erreurs de logique en omettant laelse
. Beaucoup de fautes de go caché, simplement parce qu'une condition de test peut être rarement rencontré. Rares tels événements ne sont pas dans leur visage.else: raise Exception('Logic Error')
n'est pas un faux sentiment de sécurité. C'est un véritable échec qui se passe vraiment et révèle vraiment une erreur de logique. Si votre unité de test n'est pas assez complet pour trouver l'erreur logique, alors, utilisation de la production va le trouver un jour. À l'aide d'un paresseux -- traditionnelle -- "reste-à-implicite-de la condition" ne sera jamais un échec (même en cours de production) et la logique de l'erreur restera caché à jamais comme une "étrangeté" de l'application.else
estif a < 10
. L'exemple donné par @S. Lott est un "homme de paille" pour blâmerelse
. Quelles sonta
etb
? Dès que vous écrivezif batch_size < 10 ... elif batch_size >= 10 and job_size > 3 ... else ...
vous savez ce que vous êtes le raisonnement et il y a moins de problèmes avecelse
. Mieux encore est d'encapsuler les deux conditions dans les noms de variable:is_small_batch = a < 10 ... is_huge_batch = a >= 10 and b > 3 ... if is_small_batch: ... elif is_huge_batch: ... else ...
. D'autres améliorations, bien sûr, sont possibles, certaines d'enlever complètementelse
.else
peut être tout à fait approprié dans un domaine bien défini de cas, et latry...except...else
peut parfois exprimer un problème plus simplement, d'éloquence et explicitement que toute autre structure.