tratar de atrapar finalmente la pregunta

En un bloque Try Catch Finally, ¿el bloque finally siempre se ejecuta sin importar qué, o solo si el bloque catch 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 y devolver el mensaje de error, si corresponde?

No solo se ejecutará finalmente un bloque de catch, intente ni siquiera requiere que se capture una excepción para que finalmente se ejecute. El siguiente es un código perfectamente legal:

try { //do stuff } finally { //clean up } 

De hecho, saqué los bloques de captura en un 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é solo con un bloque try {} y finalmente {} y dejé que saltasen las excepciones con su rastro de stack intacto.

El bloque finally (casi) siempre se ejecuta, haya habido o no una excepción.

Digo casi porque hay algunos casos donde finalmente no se garantiza que se llame:

  • Si hay un bucle infinito o un punto muerto en su código para que la ejecución permanezca dentro de los bloques try o catch, entonces el bloque finally nunca se ejecutará.
  • Si su aplicación finaliza abruptamente al matar el proceso.
  • Corte de energía.
  • Calling Environment.FailFast .
  • Algunas excepciones como:
    • StackOverflowException
    • OutOfMemoryException
    • ExecutingEngineException (ahora obsoleto)
  • Una excepción arrojada en un finalizador ( fuente ).

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 algunos otros casos también …

el bloque finally se ejecuta en casi todos los casos. Es por eso que se llama ‘finalmente’.

Para ver un ejemplo, consulte este artículo en c-sharpcorner.com.

Actualización: Es cierto, si conectas el cable, fundes el procesador o muelas la placa base, incluso el último ‘final’ no se ejecutará.

Pero en casi todos los escenarios “normales”, es decir, si su código arroja una excepción o no, se ejecutará el bloque finally. Que yo sepa, la única excepción ‘real’ a esta regla es una excepción de stackoverflow que terminará el progtwig sin entrar finalmente.

Actualización 2: esta pregunta fue hecha específicamente para C #. Esta respuesta NO cubre Java, Python, Matlab o Scheme.

El bloque finally se ejecutará, pero deberás 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 código dentro del bloque finally se ejecuta siempre, sin interrupciones si hubo una excepción. Por cierto, creo que ya hay numerosos hilos en SO que se ocupan de esta cuestión.