1
votes

enfin bloquer exécuter avant la pause, continuer, retourner l'instruction de la clause try en python

enfin le bloc s'exécute avant le break ou continue ou retourne l'instruction de la clause try en python alors pourquoi la sortie de ce code est différente

foo ola

la sortie est:

def bool_return():
    try:
        return print("foo")
    except:
        pass
    finally:
        return "ola"

print(bool_return())

pourquoi?


2 commentaires

Le code fait exactement ce que dit la documentation. Le bloc enfin s'exécute avant le retour . Donc, il imprime 98 que le bloc finally qui imprime 99 puis retourne ok .


pour plus d'informations, consultez python doc


3 Réponses :


1
votes

Renvoyer quelque chose est la dernière chose qu'une fonction puisse faire. Après avoir renvoyé quelque chose, Python continuera à faire ce qu'il a fait avant ou à terminer le script.

Si Python retournait immédiatement, ce serait la fin de la fonction. On pense que le bloc finally est exécuté quoi qu'il arrive, il doit donc être exécuté en premier, même si le retour d'origine est perdu.


0 commentaires

0
votes

le bloc finally est quelque chose où nous écrivons le code pour fermer les connexions à d'autres serveurs. Si au cas où nous revenions de l'instruction, nous aurons les connexions ouvertes afin qu'elle soit exécutée avant de quitter la fonction. Nous pouvons vérifier si nous écrivons un retour dans le bloc final et essayer le bloc lequel est en cours d'exécution


0 commentaires

0
votes

Votre code

var r = print("foo") < this is the statement in the try block
print ("ola")
return r

utilise une clause finally . La clause finally est exécutée avant la sortie du bloc propriétaire try / except . Cela signifie que votre pourrait est transformé en ce qui suit (pseudocode!):

var r = print("foo") < this is the statement in the try block
return r

Ignorez un instant l'instruction return qui pourrait ne pas être correcte , le coupable de votre question est de savoir comment l'interpréteur exécute les instructions:

 return print("foo")

est divisé en deux

function bool_return():
    do in case of errors goto Errors:
        var r = print("foo") < this is the statement in the try block
        print("ola") < this is the statement in the finally one
        return r
Errors:
        do nothing < this is the pass instruction.
        var r = print ("ola")
        return r 

print(bool_return())

et puis le contenu du finally est exécuté avant le retour

def bool_return():
    try:
        return print("foo")
    except:
        pass
    finally:
        return print("ola")

print(bool_return())

C'est parce que la sémantique du bloc try est la suivante

  • exécutez tout ce qui est inclus dans le bloc try . S'il s'exécute sans erreur, stockez la valeur de retour si elle est présente, puis exécutez le contenu du bloc finally . Si aucune erreur ne se produit ici et que nous avons une valeur de retour, renvoyez simplement cette valeur de retour stockée
  • si le bloc try a une erreur, exécutez ce qui se trouve dans le bloc except (si présent). Si aucune erreur ici n'est bonne, stockez la valeur de retour si elle est présente, exécutez le bloc finalize , si aucune erreur ici, retournez simplement la valeur de retour stockée
  • si le bloc except est une erreur, l'exécution est arrêtée et le bloc finally est exécuté. Ensuite, l'exception est propagée au bloc externe.
  • et maintenant les choses peuvent devenir compliquées, car vous pouvez (et allez) imbriquer plusieurs blocs try . Les étapes mentionnées ci-dessus se répètent de manière récursive jusqu'à ce que l'exception soit gérée ou que le bloc try de l'interpréteur soit atteint. Dans ce dernier cas, l'application est arrêtée et l'exception est imprimée sur la console avec la syntaxe habituelle de traceback .
  • Ceci est juste pour vous donner un aperçu de son fonctionnement. Certains détails peuvent manquer ou ne pas être corrects à 100%. Si vous souhaitez avoir plus d'informations, vous pouvez jouer avec des exceptions au W3C et en savoir plus ici .


    0 commentaires