2010-04-10 25 views

Respuesta

130

Esto es útil si desea que el método que se está ejecutando todavía genere la excepción mientras permite que los recursos se limpien adecuadamente. A continuación se muestra un ejemplo concreto de manejo de la excepción de un método de llamada.

public void yourOtherMethod() { 
    try { 
     yourMethod(); 
    } catch (YourException ex) { 
     // handle exception 
    } 
}  

public void yourMethod() throws YourException { 
    try { 
     db.store(mydata); 
    } finally { 
     db.cleanup(); 
    } 
} 
+10

de uso general con bloqueos como en: lock.lock(); intenta {/ * bloqueado * /} finalmente {lock.unlock()} – mins

60

Está allí porque el programador quería asegurarse de que se llama a db.cleanup() incluso si el código dentro del bloque try arroja una excepción. Cualquier excepción no será manejada por ese bloque, pero solo se propagarán hacia arriba después de que se ejecute el bloque finally.

+15

+1 Exactamente. El 'try' está ahí para permitir el' finally'. Las excepciones no son atrapadas. – zockman

+0

@zockman Tu comentario lo encontró. –

+1

+1 para aclarar que la excepción continúa en la pila hasta que se atrapa. Gracias –

18

¿Por qué este código hacemos de esta manera?

Porque aparentemente el código no sabe cómo manejar las excepciones en este nivel. Eso está bien - siempre que lo haga una de las personas que llaman, es decir, siempre que la excepción finalmente se maneje en alguna parte.

A menudo, el código de bajo nivel no puede reaccionar adecuadamente a las excepciones porque el usuario necesita ser notificado, o la excepción debe registrarse, o se debe probar otra estrategia. El código de bajo nivel realiza uno funciona solamente y no sabe acerca de la toma de decisiones de alto nivel.

Pero el código todavía necesita limpiar sus recursos (porque si no lo hace, podrían filtrarse), por lo que hace precisamente eso en la cláusula finally, asegurándose de que siempre sucede, si una excepción era arrojado o no.

2

El bloque finally garantiza que incluso cuando se lanza una RuntimeException (tal vez debido a algún error en el código llamado), se realizará la llamada db.cleanup().

Esto también se utiliza a menudo para evitar exceso de anidación:

try 
{ 
    if (foo) return false; 
    //bla ... 
    return true; 
} 
finally 
{ 
    //clean up 
} 

Especialmente cuando hay muchos puntos en los que el método retorna, esto mejora la legibilidad como cualquiera puede ver el código de limpieza se llama en todos los casos .

0

El código lo está haciendo para asegurarse de que la base de datos esté cerrada.
Por lo general, la forma en que lo haría es poner todo el código de acceso a la base de datos en el bloque try, y luego poner una llamada para cerrar la base de datos en el bloque finally.
La forma en que try ... finalmente funciona, significa que se ejecuta el código en el bloque try, y el código en el bloque finally se ejecuta cuando eso termina ... pase lo que pase.
Corto de la computadora que se tira de la pared, finalmente se ejecutará.
Esto significa que incluso si se invoca una excepción y el método tarda tres años en ejecutarse, seguirá ingresando en el bloque finally y la base de datos se cerrará.

0

Si cualquiera de los códigos en el bloque try puede arrojar una excepción marcada, tiene que aparecer en la cláusula throws de la firma del método. Si se lanza una excepción sin marcar, se borra del método.

El bloque finally siempre se ejecuta, ya sea que se genere una excepción o no.

Cuestiones relacionadas