Lo que está adentro finalmente los bloques se ejecutan (casi) siempre, entonces, ¿cuál es la diferencia entre encerrar el código en él o dejarlo sin cerrar?
c#
exception-handling
Rodrigo
fuente
fuente
Respuestas:
El código dentro de un bloque finalmente se ejecutará independientemente de si hay una excepción o no. Esto es muy útil cuando se trata de ciertas funciones de limpieza que debe ejecutar siempre como cerrar las conexiones.
Ahora, estoy adivinando su pregunta es por qué usted debe hacer esto:
Cuando puedes hacer esto:
La respuesta es que muchas veces el código dentro de su declaración catch volverá a lanzar una excepción o saldrá de la función actual. Con el último código, el "alwaysDoThis ();" La llamada no se ejecutará si el código dentro de la instrucción catch emite una devolución o arroja una nueva excepción.
fuente
La mayoría de las ventajas de usar try-finally ya se han señalado, pero pensé en agregar esta:
Este comportamiento lo hace muy útil en diversas situaciones, particularmente cuando necesita realizar una limpieza (desechar recursos), aunque un bloque de uso suele ser mejor en este caso.
fuente
cada vez que use solicitudes de código no administradas como lectores de flujo, solicitudes de db, etc. y desea detectar la excepción, luego use try catch finalmente y cierre la secuencia, el lector de datos, etc., finalmente, si no lo hace cuando se produce un error, la conexión no se cierra, esto es realmente malo con las solicitudes de db
si no desea detectar el error, use
y el objeto de conexión se eliminará automáticamente si hay un error, pero no captura el error
fuente
Porque finalmente se ejecutará incluso si no manejas una excepción en un bloque catch.
fuente
Finalmente, las declaraciones pueden ejecutarse incluso después del retorno.
fuente
finally
, como en:es una oportunidad garantizada para ejecutar código después de su
try..catch
bloqueo, independientemente de si su bloque try produjo o no una excepción.Eso lo hace perfecto para cosas como liberar recursos, conexiones db, identificadores de archivos, etc.
fuente
Explicaré el uso de finalmente con una excepción de lector de archivos Ejemplo
en el ejemplo anterior, si falta el archivo llamado Data.txt, se generará una excepción y se manejará, pero la declaración llamada
StreamReader.Close();
nunca se ejecutará.Debido a esto, los recursos asociados con el lector nunca se lanzaron.
Happy Coding :)
Nota: "@" se utiliza para crear una cadena literal , para evitar el error de "Secuencia de escape no reconocida". El símbolo @ significa leer esa cadena literalmente, y no interpretar los caracteres de control de otra manera.
fuente
Supongamos que necesita volver a colocar el cursor en el puntero predeterminado en lugar de un cursor en espera (reloj de arena). Si se lanza una excepción antes de configurar el cursor, y la aplicación no se bloquea por completo, podría quedar con un cursor confuso.
fuente
A veces no desea manejar una excepción (sin bloqueo), pero desea ejecutar un código de limpieza.
Por ejemplo:
fuente
El último bloque es valioso para limpiar los recursos asignados en el bloque de prueba, así como para ejecutar cualquier código que deba ejecutarse incluso si hay una excepción. El control siempre se pasa al bloque finalmente, independientemente de cómo salga el bloque try.
fuente
Ahh ... creo que veo lo que estás diciendo! Me tomó un segundo ... te preguntas "por qué colocarlo en el bloque finalmente en lugar de después del bloque finalmente y completamente fuera del try-catch-finally".
Como ejemplo, podría deberse a que está deteniendo la ejecución si arroja un error, pero aún desea limpiar recursos, como archivos abiertos, conexiones de bases de datos, etc.
fuente
El flujo de control del bloque Finalmente es posterior al bloque Try o Catch.
con la excepción 1> 2> 3> 4> 5 si 3 tiene una declaración de devolución 1> 2> 3> 4
sin excepción 1> 2> 4> 5 si 2 tiene una declaración de retorno 1> 2> 4
fuente
Como se menciona en la documentación :
También vale la pena leer esto , que dice:
Por lo tanto, está claro que el código que reside en una
finally
cláusula se ejecutará incluso si unacatch
cláusula anterior tenía unareturn
declaración.fuente