No estoy seguro de por qué necesitamos finallyen las try...except...finallydeclaraciones. 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
finallypara 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
withdeclaració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
finallyque 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
finallycláusula se ejecuta sin importar qué mientras que laelseclá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
finallycláusula se ejecuta independientemente de una excepción. Espero que esto ayude.fuente
elseera una cosa. Útil para saber.Los bloques de código no son equivalentes. La
finallyclá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
finallycláusula está destinada a definir acciones de limpieza que deben ejecutarse en todas las circunstancias .Un ejemplo:
Como puede ver, la
finallycláusula se ejecuta en cualquier caso. La cláusulaTypeErrorno maneja el aumento dividiendo dos cadenasexcepty, por lo tanto, se vuelve a generar después de que lafinallyclá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
finallyes para definir "acciones de limpieza" . Lafinallycláusula se ejecuta en cualquier caso antes de abandonar latrydeclaració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_infopodrí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
passpor errores, elexceptbloque 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
trybloque. (es decir,create_resourcesí 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 finallybloque completo y decir quefinallynecesito cerrar el archivo en cualquier caso como:De lo contrario, el archivo sigue abierto es el fondo.
..Más Aquí
fuente