No estoy seguro de por qué necesitamos finally
en las try...except...finally
declaraciones. 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?
Puede usar
finally
para asegurarse de que los archivos o recursos estén cerrados o liberados, independientemente de si se produce una excepción, incluso si no detecta la excepción. (O si no captas esa excepción específica ).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 publicación en el blog sobre un abuso
finally
que los lectores pueden encontrar divertido.fuente
No son equivalentes. Finalmente, el código se ejecuta sin importar qué más suceda. Es útil para el código de limpieza que debe ejecutarse.
fuente
Finally code is run no matter what else happens
... a menos que haya un bucle infinito. O un corte de energía. Oos._exit()
. O ...os._exit
.Para agregar a las otras respuestas anteriores, la
finally
cláusula se ejecuta sin importar qué mientras que laelse
cláusula se ejecuta solo si no se generó una excepción.Por ejemplo, escribir en un archivo sin excepciones generará lo siguiente:
SALIDA:
Si hay una excepción, el código generará lo siguiente (tenga en cuenta que se produce un error deliberado al mantener el archivo de solo lectura).
SALIDA:
Podemos ver que la
finally
cláusula se ejecuta independientemente de una excepción. Espero que esto ayude.fuente
else
era una cosa. Útil para saber.Los bloques de código no son equivalentes. La
finally
cláusula también se ejecutará sirun_code1()
arroja una excepción que no seaTypeError
, o sirun_code2()
arroja una excepción, mientras queother_code()
en la primera versión no se ejecutará en estos casos.fuente
En su primer ejemplo, ¿qué sucede si se produce
run_code1()
una excepción que no es asíTypeError
? ...other_code()
no se ejecutará.Compare eso con la
finally:
versión:other_code()
se garantiza que se ejecutará independientemente de cualquier excepción que se genere.fuente
Como se explica en la documentación , la
finally
cláusula está destinada a definir acciones de limpieza que deben ejecutarse en todas las circunstancias .Un ejemplo:
Como puede ver, la
finally
cláusula se ejecuta en cualquier caso. La cláusulaTypeError
no maneja el aumento dividiendo dos cadenasexcept
y, por lo tanto, se vuelve a generar después de que lafinally
cláusula se haya ejecutado.En aplicaciones del mundo real, la cláusula final es útil para liberar recursos externos (como archivos o conexiones de red), independientemente de si el uso del recurso fue exitoso.
fuente
El ejemplo perfecto es el siguiente:
fuente
finally
es para definir "acciones de limpieza" . Lafinally
cláusula se ejecuta en cualquier caso antes de abandonar latry
declaración, ya sea que haya ocurrido una excepción (incluso si no la maneja) o no.Segundo el ejemplo de @ Byers.
fuente
Finalmente, también se puede usar cuando desea ejecutar código "opcional" antes de ejecutar el código para su trabajo principal y ese código opcional puede fallar por varias razones.
En el siguiente ejemplo, no sabemos con precisión qué tipo de excepciones
store_some_debug_info
podría arrojar.Podríamos correr:
Pero, la mayoría de los linters se quejarán por la captura de una excepción demasiado vaga. Además, dado que estamos eligiendo solo
pass
por errores, elexcept
bloque realmente no agrega valor.El código anterior tiene el mismo efecto que el primer bloque de código, pero es más conciso.
fuente
Usar Delphi profesionalmente durante algunos años me enseñó a salvaguardar mis rutinas de limpieza usando finalmente. Delphi prácticamente aplica el uso de finalmente para limpiar los recursos creados antes del bloque try, para evitar una pérdida de memoria. Así también funciona Java, Python y Ruby.
y el recurso se limpiará independientemente de lo que haga entre el intento y el final. Además, no se limpiará si la ejecución nunca llega al
try
bloque. (es decir,create_resource
sí mismo arroja una excepción) Hace que su código "excepción segura".En cuanto a por qué realmente necesita un bloqueo final, no todos los idiomas lo hacen. En C ++ donde ha llamado automáticamente destructores que imponen la limpieza cuando una excepción desenrolla la pila. Creo que este es un paso adelante en la dirección de un código más limpio en comparación con probar ... finalmente los idiomas.
fuente
Un bloque try tiene solo una cláusula obligatoria: la declaración try. Las cláusulas except, else y finally son opcionales y se basan en la preferencia del usuario.
finalmente: antes de que Python abandone la declaración de prueba, ejecutará el código en el bloque finalmente bajo cualquier condición, incluso si está terminando el programa. Por ejemplo, si Python se encontró con un error al ejecutar el código en el bloque except o else, el bloque finalmente todavía se ejecutará antes de detener el programa.
fuente
Ejecute estos códigos Python3 para ver la necesidad de finalmente:
CASO 1:
CASO 2:
Pruebe las siguientes entradas cada vez:
** En una etapa muy temprana de aprendizaje de Python.
fuente
Estaba tratando de ejecutar un código donde quería leer las hojas de Excel. El problema era, si hay un archivo que no tiene una hoja llamada, por ejemplo: SheetSum ¡No puedo moverlo a la ubicación de error! El código que escribí fue:
Dando error:
Tuve que agregar el
try except with finally
bloque completo y decir quefinally
necesito cerrar el archivo en cualquier caso como:De lo contrario, el archivo sigue abierto es el fondo.
..Más Aquí
fuente