62 votes

try / else avec retour dans le bloc try

Je suis tombé sur un comportement étrange en python. Je n'ai pas pu trouver d'informations à ce sujet dans l'aide python ou sur SE alors voici :

 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)

le résultat:

 entering divide
exit
1
entering divide
error
exit
None

Il semble que python n'entrera pas dans le else si une valeur est renvoyée dans le try . Cependant, il ira toujours dans le bloc finally Je ne comprends pas vraiment pourquoi. Quelqu'un peut-il m'aider avec cette logique?

Merci

65voto

wRAR Points 13223

http://docs.python.org/reference/compound_stmts.html#the-try-statement

La clause facultative else est exécutée si et quand le contrôle sort de la fin de la clause d'essai.

Actuellement, le contrôle « s'écoule par la fin » sauf dans le cas d'un exception ou l'exécution d'une instruction return, continue ou break.

25voto

Saul Points 10449

La raison de ce comportement est due au return intérieur de try .

Lorsqu'une exception se produit, les finally et except s'exécutent avant return . Dans le cas contraire où aucune exception ne se produit, else s'exécute et except ne s'exécute pas.

Cela fonctionne comme prévu :

 def divide(x, y):
    print 'entering divide'
    result = 0
    try:
        result = x/y
    except:
        print 'error'
    else:
        print 'no error'
    finally:
        print 'exit'

    return result

print divide(1, 1)
print divide(1, 0)

1voto

Musaab Points 526

"return" termine la fonction et renvoie ce que vous voulez qu'elle renvoie. Donc ça ne va pas continuer bien sûr. "finally" est toujours exécuté.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X