occurred has excepciones error catch java exception

java - has - ¿Tiene sentido hacer "try-finally" sin "catch"?



java exception minecraft (6)

Vi un código como este:

try { db.store(mydata); } finally { db.cleanup(); }

Pensé que se suponía que el try tenía un catch .

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


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

Porque aparentemente el código no sabe cómo manejar excepciones en este nivel. Eso está bien , siempre que lo haga uno de los llamantes, 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 solo realiza una función y no sabe acerca de la toma de decisiones de alto nivel.

Pero el código aún necesita limpiar sus recursos (porque si no lo hace, se filtrarían), así que lo hace en la cláusula finally , asegurándose de que siempre ocurra, ya sea que se haya lanzado una excepción o no.


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 usa a menudo para evitar demasiada 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 ya que cualquiera puede ver que se llama el código de limpieza en todos los casos.


El código lo está haciendo para garantizar 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 su base de datos en el bloque try, y luego colocar 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.
A menos que la computadora sea arrancada 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á.


Está ahí porque el programador quería asegurarse de que se db.cleanup() incluso si el código dentro del bloque try genera 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.


Esto es útil si desea que el método que se está ejecutando presente 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(); } }


Si alguno de los códigos en el bloque try puede arrojar una excepción marcada, debe 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.