Je ne sais pas pourquoi nous avons besoin finally
de try...except...finally
déclarations. À mon avis, ce bloc de code
try:
run_code1()
except TypeError:
run_code2()
other_code()
est le même avec celui-ci en utilisant finally
:
try:
run_code1()
except TypeError:
run_code2()
finally:
other_code()
Suis-je en train de manquer quelque chose?
Vous pouvez utiliser
finally
pour vous assurer que les fichiers ou les ressources sont fermés ou libérés, qu'une exception se produise, même si vous ne capturez pas l'exception. (Ou si vous n'attrapez pas cette exception spécifique .)Dans cet exemple, vous feriez mieux d'utiliser l'
with
instruction, mais ce type de structure peut être utilisé pour d'autres types de ressources.Quelques années plus tard, j'ai écrit un article de blog sur un abus de ce
finally
que les lecteurs pourraient trouver amusant.la source
Ils ne sont pas équivalents. Enfin, le code est exécuté quoi qu'il arrive d'autre. Il est utile pour le code de nettoyage qui doit s'exécuter.
la source
Finally code is run no matter what else happens
... sauf s'il y a une boucle infinie. Ou un powercut. Ouos._exit()
. Ou ...os._exit
.Pour ajouter aux autres réponses ci-dessus, la
finally
clause s'exécute quoi qu'il en soit alors que laelse
clause ne s'exécute que si aucune exception n'a été levée.Par exemple, l'écriture dans un fichier sans exception produira ce qui suit:
PRODUCTION:
S'il y a une exception, le code affichera ce qui suit, (notez qu'une erreur délibérée est provoquée en gardant le fichier en lecture seule.
PRODUCTION:
Nous pouvons voir que la
finally
clause s'exécute indépendamment d'une exception. J'espère que cela t'aides.la source
else
c'était une chose. Utile à savoir.Les blocs de code ne sont pas équivalents. La
finally
clause sera également exécutée sirun_code1()
lève une exception autre queTypeError
, ou sirun_code2()
lève une exception, alors queother_code()
dans la première version ne serait pas exécutée dans ces cas.la source
Dans votre premier exemple, que se passe-t-il si
run_code1()
déclenche une exception qui ne l'est pasTypeError
? ...other_code()
ne sera pas exécuté.Comparez cela avec la
finally:
version:other_code()
est garanti d'être exécuté indépendamment de toute exception levée.la source
Comme expliqué dans la documentation , la
finally
clause est destinée à définir des actions de nettoyage qui doivent être exécutées en toutes circonstances .Un exemple:
Comme vous pouvez le voir, la
finally
clause est exécutée dans tous les cas. La valeurTypeError
levée en divisant deux chaînes n'est pas gérée par laexcept
clause et est donc relancée après l'finally
exécution de la clause.Dans les applications du monde réel, la clause finally est utile pour libérer des ressources externes (telles que des fichiers ou des connexions réseau), que l'utilisation de la ressource ait réussi ou non.
la source
Un exemple parfait est comme ci-dessous:
la source
finally
sert à définir des "actions de nettoyage" . Lafinally
clause est exécutée dans tous les cas avant de quitter l'try
instruction, qu'une exception (même si vous ne la gérez pas) s'est produite ou non.J'appuie l'exemple de @ Byers.
la source
Enfin, vous pouvez également être utilisé lorsque vous souhaitez exécuter du code "facultatif" avant d'exécuter le code pour votre travail principal et que le code facultatif peut échouer pour diverses raisons.
Dans l'exemple suivant, nous ne savons pas exactement quel type d'exceptions
store_some_debug_info
peuvent lever.Nous pourrions exécuter:
Mais, la plupart des linters se plaindront d'attraper trop vague d'exception. De plus, comme nous choisissons de ne faire que
pass
des erreurs, leexcept
bloc n'ajoute pas vraiment de valeur.Le code ci-dessus a le même effet que le 1er bloc de code mais est plus concis.
la source
L'utilisation professionnelle de delphi pendant quelques années m'a appris à protéger mes routines de nettoyage en utilisant enfin. Delphi applique à peu près l'utilisation de finalement pour nettoyer toutes les ressources créées avant le bloc try, de peur de provoquer une fuite de mémoire. C'est aussi ainsi que Java, Python et Ruby fonctionnent.
et la ressource sera nettoyée indépendamment de ce que vous faites entre essayer et enfin. De plus, il ne sera pas nettoyé si l'exécution n'atteint jamais le
try
bloc. (c.-àcreate_resource
- d. lui - même lève une exception) Il rend votre code «d'exception sûr».Quant à savoir pourquoi vous avez réellement besoin d'un bloc enfin, toutes les langues ne le font pas. En C ++ où vous avez automatiquement appelé des destructeurs qui imposent le nettoyage lorsqu'une exception déroule la pile. Je pense que c'est un pas en avant vers un code plus propre que d'essayer ... enfin des langues.
la source
Un bloc try n'a qu'une seule clause obligatoire: l'instruction try. Les clauses except, else et finally sont facultatives et basées sur les préférences de l'utilisateur.
enfin: Avant que Python ne quitte l'instruction try, il exécutera le code dans le bloc finally dans toutes les conditions, même s'il met fin au programme. Par exemple, si Python a rencontré une erreur lors de l'exécution du code dans le bloc except ou else, le bloc finally sera toujours exécuté avant d'arrêter le programme.
la source
Exécutez ces codes Python3 pour observer enfin la nécessité de:
CAS 1:
CAS2:
Essayez à chaque fois les entrées suivantes:
** À un stade très précoce de l'apprentissage de Python.
la source
J'essayais d'exécuter un code où je voulais lire des feuilles Excel. Le problème était, s'il y a un fichier qui n'a pas de feuille nommée, dites: SheetSum Je ne peux pas le déplacer vers l'emplacement d'erreur !! Le code que j'ai écrit était:
Erreur de don:
J'ai dû ajouter un
try except with finally
bloc complet et dire quefinally
je dois fermer le fichier dans tous les cas comme:Sinon, le fichier reste ouvert est l'arrière-plan.
..Plus ici
la source