La possibilité d'obtenir une exception levée et ensuite simplement avalée parce que vous utilisez une continue
est un argument fort, mais l'exception est également avalée lorsque vous utilisez un break
ou return
à la place.
Par exemple, ceci fonctionne et l'exception est avalée :
for i in range(10):
print i
try:
raise Exception
finally:
break
print i # not gonna happen
Cela fonctionne à nouveau sans erreur (dans une fonction) et l'exception est également avalée :
for i in range(10):
print i
try:
raise Exception
finally:
return
print i # not gonna happen
Alors pourquoi break
y return
être autorisé dans un finally
avec ou sans les éventuelles erreurs soulevées, mais continue
pas ?
Vous pouvez également considérer la combinaison des facteurs suivants dans la question :
-
finally
est toujours exécuté ;
-
continue
"abandonne" l'itération en cours.
Cela signifie qu'à l'intérieur de chaque boucle, en raison de l'utilisation de la fonction finally
toujours en cours d'exécution, vous aurez toujours un continue
sorcière essentiellement dit "annuler l'itération actuelle", "annuler l'itération actuelle", "annuler l'itération actuelle" ... ce qui n'a pas vraiment de sens. Mais cela n'a pas de sens non plus d'utiliser break
y return
. L'itération en cours est également interrompue à la seule différence que que vous vous retrouvez maintenant avec une seule itération.
Donc la question "Pourquoi continue
non autorisé dans un finally
?" peut également se poser la question suivante : "Pourquoi le break
y return
autorisé ?".
Peut-être parce que ça avait du sens de ne pas le faire à ce moment-là ? C'était la décision des développeurs et maintenant c'est comme ça ? Bien sûr, cela pourrait aussi être la paresse de l'implémenteur, mais qui sait, peut-être avaient-ils quelque chose en tête et peut-être que, dans une autre version de Python, il serait plus logique d'avoir une autre façon de procéder. plus logique de le faire d'une autre manière ?
L'idée est que les exemples ici sont juste extrêmes . On n'écrit pas du code comme ça, n'est-ce pas ? Il y a sûrement des logique dans le finally
bloc pour dire quand break/return/continue
ou quoi que ce soit d'autre, et ne pas se contenter d'être aussi direct que ça. En tant que tel, IMHO continue
à l'intérieur d'un finally
devrait être autorisé parce que j'apprécierais d'écrire un code propre avec l'utilisation de continue
sur finally
si c'est ce dont j'ai besoin, au lieu de recourir à un code de contournement pour cette limitation (c'est-à-dire dans la philosophie de Python "Nous sommes tous des adultes consentants ici").