¿Por qué necesitamos la cláusula "finalmente" en Python?

Resuelto RNA asked hace 12 años • 18 respuestas

No estoy seguro de por qué necesitamos finallydeclaraciones try...except...finally. En mi opinión, este bloque de código

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

es lo mismo con este usando finally:

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

¿Me estoy perdiendo de algo?

RNA avatar Jul 19 '12 06:07 RNA
Aceptado

Hace la diferencia si regresa temprano:

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

Comparar con esto:

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

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

Otras situaciones que pueden causar diferencias:

  • Si se lanza una excepción dentro del bloque excepto.
  • Si se lanza una excepción run_code1()pero no es un archivo TypeError.
  • Otras declaraciones de flujo de control como declaraciones continuey break.
Mark Byers avatar Jul 18 '2012 23:07 Mark Byers

Puede usarlo finallypara asegurarse de que los archivos o recursos se cierren o liberen independientemente de si ocurre una excepción, incluso si no detecta la excepción. (O si no detecta esa excepción específica ).

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

En este ejemplo sería mejor usar la withdeclaración, pero este tipo de estructura se puede usar para otros tipos de recursos.

Unos años más tarde, escribí una entrada en el blog sobre un abuso finallyque los lectores pueden encontrar divertido.

kindall avatar Jul 18 '2012 23:07 kindall