¿Por qué necesitamos la cláusula "finalmente" en Python?
No estoy seguro de por qué necesitamos finally
declaraciones 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?
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 archivoTypeError
. - Otras declaraciones de flujo de control como declaraciones
continue
ybreak
.
Puede usarlo finally
para 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 with
declaració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 finally
que los lectores pueden encontrar divertido.