essayer / autre, avec le retour dans le bloc try
Je suis tombé sur un étrange comportement en python. Je ne pouvais pas trouver d'informations à ce sujet dans le python ou sur SOI si elle est ici:
def divide(x, y):
print 'entering divide'
try:
return x/y
except:
print 'error'
else:
print 'no error'
finally:
print 'exit'
print divide(1, 1)
print divide(1, 0)
la sortie:
entering divide
exit
1
entering divide
error
exit
None
Il semble que python n'ira pas à l'intérieur de la else
bloc si une valeur est retournée dans le try
. Cependant, il sera toujours aller dans le finally
bloc. Je ne comprends vraiment pas pourquoi. Quelqu'un peut-il m'aider avec cette logique?
grâce
Vous devez vous connecter pour publier un commentaire.
http://docs.python.org/reference/compound_stmts.html#the-try-statement
else
équivalent qui est garanti de fonctionner si une exception n'était pas coincé, même si les essayerreturn
s ou un uncaught exception est levée (cela empêche également leelse
de course)La raison de ce comportement est à cause de la
return
à l'intérieur detry
.Lorsqu'une exception se produit, les deux
finally
etexcept
blocs exécuter avantreturn
. Dans le cas contraire où aucune exception se produit,else
s'exécute etexcept
ne le fait pas.Cela fonctionne comme prévu:
La
else
bloc n'est pas exécuté parce que vous avez quitté la fonction avant de avons eu l'occasion de le faire.Cependant, la
finally
bloc est toujours exécutée (sauf si vous tirer sur le cordon d'alimentation ou quelque chose comme ça).Considérer (comme une expérience de pensée; merci de ne pas le faire dans le code réel):
Voir de quoi il en retourne:
Si vous trouvez cette confusion, vous n'êtes pas seul. Certains langages comme C# activement vous empêcher de placer un
return
déclaration dans unfinally
clause.return
etraise
est toujours une bonne idée, que de clarifier le code de sorties.Pourquoi ne pas le
else
clause de courir?Lorsque vous appelez
divide(1, 0)
, votretry
clause soulève une exceptionZeroDivisionError
, de sorte que leelse
clause ne s'exécute pas.Lorsque vous appelez
divide(1, 1)
, letry
clause s'exécute avec succès, et retourne. Ainsi, leelse
clause n'est jamais atteint.Pourquoi le
finally
clause de toujours courir?Voir ci-dessus.
Référence https://docs.python.org/3.5/tutorial/errors.html
"retour" se termine la fonction et renvoie ce que vous voulez qu'il revienne. Afin de ne pas aller, bien sûr. "enfin" est toujours exécuté.