xmldoc returns name documentacion c# exception-handling

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:

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.