name - summary returns c#
tratar de atrapar finalmente la pregunta (5)
El bloque finally (casi) siempre se ejecuta, haya o no una excepción.
Digo casi porque hay algunos casos en los que finalmente no se garantiza que se llame:
- Si hay un bucle infinito o un interbloqueo en su código para que la ejecución permanezca dentro de los bloques try o catch, el bloque finally nunca se ejecutará.
- Si su aplicación termina abruptamente matando el proceso.
- Corte de energía.
- Llamando Environment.FailFast .
- Algunas excepciones como:
- StackOverflowException
- OutOfMemoryException
- ExecutingEngineException (ahora obsoleto)
- Una excepción lanzada en un finalizador ( source ).
Además, incluso si se ingresa el bloque finally si ocurre una ThreadAbortException
justo cuando el hilo ingresa en el bloque finally, el código en el bloque finally no se ejecutará.
Puede haber otros casos también ...
En un bloque Probar captura finalmente, ¿se ejecuta siempre el bloque finally sin importar qué, o solo si el bloque captura no devuelve un error?
Tenía la impresión de que el bloque finally solo se ejecuta si el bloque catch pasa sin errores. Si el bloque catch se ejecuta debido a un error, ¿no debería detener la ejecución por completo y devolver el mensaje de error si lo hubiera?
El bloque finally se ejecutará, pero deberá tener cuidado con las excepciones dentro del bloque finally.
try {
// some disposable method "o"
} finally {
o.Dispose(); // if o is null, exception is thrown
// anything after this exception will fail to execute
}
El bloque finalmente se ejecuta en casi todos los casos. Por eso se llama ''finalmente''.
Para ver un ejemplo, consulte este artículo en c-sharpcorner.com.
Actualización: es cierto, si enchufa el cable, funde el procesador o muele la placa base, incluso el último "finalmente" no se ejecutará.
Pero en casi todos los escenarios ''normales'', es decir, si su código produce una excepción o no, se ejecutará el bloque finally. Por lo que sé, la única excepción "real" a esta regla es una excepción de que terminará el programa sin entrar finalmente.
Actualización 2: esta pregunta se hizo específicamente para C #. Esta respuesta NO cubre Java, Python, Matlab o Scheme.
El código dentro del bloque finally siempre se ejecuta, sin regad si hubo una excepción. Por cierto, creo que ya hay numerosos hilos en SO que tratan con esta pregunta.
No solo se ejecutará un bloque final después de un bloque catch, el intento ni siquiera requiere que se detecte ninguna excepción para que el último se ejecute. El siguiente es código perfectamente legal:
try
{
//do stuff
}
finally
{
//clean up
}
De hecho, saqué los bloques catch en algún código que heredé cuando el bloque catch consistía en:
catch(Exception ex)
{
throw ex;
}
En ese caso, todo lo que se requería era limpiar, así que lo dejé con solo un bloque {} de prueba y finalmente {} y dejé que las excepciones se dispararan con su rastro de pila intacto.