2010-08-06 10 views
64

Por lo que puedo decir, los dos siguientes fragmentos de código tendrán el mismo propósito. ¿Por qué tener finally bloques en absoluto?¿Por qué usamos finalmente bloques?

Código A:

try { /* Some code */ } 
catch { /* Exception handling code */ } 
finally { /* Cleanup code */ } 

Código B:

try { /* Some code */ } 
catch { /* Exception handling code */ } 
// Cleanup code 
+0

Esto no es específico de C# es una pregunta de .Net – Sruly

+1

No es necesario más con java7: AutomaticResourceManagement, try (new resourceDeclartion()) {} –

Respuesta

114
  • ¿Qué sucede si se lanza una excepción que no está manejando? (Espero que no esté atrapando Throwable ...)
  • ¿Qué sucede si regresa desde el interior del bloque de prueba?
  • ¿Qué sucede si el bloque catch arroja una excepción?

Un bloque finally se asegura de que embargo que salga de ese bloque (dadas algunas de las formas de aborto de todo el proceso de forma explícita), conseguirá ejecutado. Eso es importante para la limpieza determinista de los recursos.

+36

No necesariamente cierto; finalmente no se ejecutará si (1) hay una llamada 'System.exit()' (2) hay un ciclo infinito en la prueba o uno de los bloque catch (3) Hago el complemento en la computadora – NullUserException

+1

+1 para el System.exit() –

+0

sí, parece que son resons válidos para tener finalmente. –

5

Por último siempre es ejecutado, donde por ejemplo el código después de la captura no.

+0

por qué no! Si la excepción se maneja correctamente, el código se ejecutará definitivamente. –

+1

@Nadeem: vea mi respuesta por 3 razones por las cuales puede no suceder. –

1

Porque necesita ese código para ejecutarse independientemente de cualquier excepción que pueda producirse. Por ejemplo, puede que necesite limpiar algún recurso no administrado (el compilador 'using' se compila en un bloque try/finally).

0

finally SIEMPRE se ejecuta, a menos que la JVM se haya cerrado, finally solo proporciona un método para poner el código de limpieza en un solo lugar.

Sería demasiado tedioso si tuviera que poner el código de limpieza en cada uno de los bloques catch.

0

Puede haber momentos en los que desee ejecutar una pieza de código pase lo que pase. Si se lanza una excepción o no. Entonces uno usa finally.

8

Tenga en cuenta que (al menos en Java, probablemente también en C#), también es posible tener un bloque try sin un catch, pero con un finally. Cuando una excepción ocurre en el bloque try, el código en el bloque finally se ejecuta antes de que la excepción se produce más arriba:

InputStream in = new FileInputStream("somefile.xyz"); 
try { 
    somethingThatMightThrowAnException(); 
} 
finally { 
    // cleanup here 
    in.close(); 
} 
7

Es posible que desee poner el código que desea de todos modos se ejecutan independientemente de lo que sucede en tu intento o bloque de captura.

Además, si está utilizando el catch múltiple y si desea poner algún código que sea común para todos los bloques catch, sería un lugar para ponerlo, pero no puede estar seguro de que se haya ejecutado todo el código en try.

Por ejemplo:

conn c1 = new connection(); 
try { 
    c1.dosomething(); 
} catch (ExceptionA exa) { 
    handleexA(); 
    //c1.close(); 
} catch (ExceptionB exb) { 
    handleexB(); 
    //c1.close(); 
} finally { 
    c1.close(); 
} 
2

A pesar de que nuestra aplicación se cierra con fuerza habrá algunas tareas, que hay que ejecutar (como la liberación de memoria, base de datos de cierre, bloqueo de la liberación, etc.), si se escribe estas líneas de código en el bloque finally se ejecutará si se lanza una excepción o no ...

Su aplicación puede ser una colección de hilos, Exception termina el hilo pero no toda la aplicación, en este caso finally es más útil.

En algunos casos finally no ejecutará como JVM Falla, hilo terminado, etc.

0

Si bloque catch lanza ninguna excepción a continuación código restante no será ejecutada, por tanto, tenemos que escribir el bloque finaly.

Cuestiones relacionadas