383 votes

Pourquoi avons-nous besoin d'un "enfin" déclaration en Python?

Je ne suis pas sûr pourquoi nous avons besoin d' finally en try...except...finally des déclarations. À mon avis, ce bloc de code

try:
    run_code1()
except TypeError:
    run_code2()
other_code()

est le même avec celui-ci à l'aide de finally:

try:
    run_code1()
except TypeError:
    run_code2()
finally:
    other_code()

Ai-je raté quelque chose?

514voto

Mark Byers Points 318575

Cela fait une différence si vous revenez au début:

try:
    run_code1()
except TypeError:
    run_code2()
    return None   # The finally block is run before the method returns
finally:
    other_code()

Comparer à ça:

try:
    run_code1()
except TypeError:
    run_code2()
    return None   

other_code()  # This doesn't get run if there's an exception.

D'autres situations qui peuvent entraîner des différences:

  • Si une exception est générée à l'intérieur du bloc except.
  • Si une exception est levée dans run_code1() mais ce n'est pas un TypeError.
  • D'autres instructions de flux de contrôle tels que l' continue et break des déclarations.

103voto

kindall Points 60645

Vous pouvez utiliser finally afin de s'assurer que les fichiers ou les ressources sont fermés ou libéré, indépendamment de savoir si une exception se produit, même si vous n'attrapez pas l'exception. (Ou si vous n'avez pas compris que le spécifique exception).

myfile = open("test.txt", "w")

try:
    myfile.write("the Answer is: ")
    myfile.write(42)   # raises TypeError, which will be propagated to caller
finally:
    myfile.close()     # will be executed before TypeError is propagated

Dans cet exemple, vous seriez mieux à l'aide de l' with déclaration, mais ce genre de structure peut être utilisée pour d'autres types de ressources.

31voto

Antimony Points 13190

Ils ne sont pas équivalents. Enfin, le code est exécuté n'importe quoi d'autre qui se passe. Il est utile pour le nettoyage de code à exécuter.

8voto

Sven Marnach Points 133943

Les blocs de code ne sont pas équivalentes. L' finally clause sera également exécuter si run_code1() déclenche une exception autre que TypeError, ou si run_code2() lève une exception, alors que, other_code() dans la première version ne serait pas dans ces cas.

7voto

mhawke Points 10385

Dans ton premier exemple, ce qui se passe si run_code1() soulève une exception qui n'est pas TypeError? ... other_code() ne sera pas exécuté.

Comparez cela avec l' finally: version: other_code() est garanti pour être exécutée indépendamment de toute exception doit être élevé.

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