Respuestas:
Esto es útil si desea que el método que se está ejecutando actualmente arroje la excepción y permita que los recursos se limpien adecuadamente. A continuación se muestra un ejemplo concreto de manejar 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();
}
}
catch
bloque, la excepción lanzada finally
se ejecutará antes que cualquier excepción en el try
bloque. Entonces, si hay dos excepciones, una en try
y una en finally
la única excepción que se lanzará es la que está adentro finally
. Este comportamiento no es el mismo en PHP y Python, ya que ambas excepciones se lanzarán al mismo tiempo en estos lenguajes y el orden de excepciones es try
primero y luego finally
.
Está allí porque el programador quería asegurarse de que db.cleanup()
se llamara incluso si el código dentro del bloque try arroja una excepción. Las excepciones no serán manejadas por ese bloque, pero solo se propagarán hacia arriba después de que se ejecute el bloque finalmente.
try
solo está ahí para permitir el finally
. No se capturan excepciones.
¿Por qué este código lo hace de esta manera?
Porque aparentemente el código no sabe cómo manejar excepciones a este nivel. Eso está bien , siempre que lo haga una de las personas que llaman, es decir, siempre y cuando la excepción finalmente se maneje en algún lugar.
A menudo, el código de bajo nivel no puede reaccionar adecuadamente a las excepciones porque el usuario debe ser notificado, o la excepción debe registrarse, o debe intentarse otra estrategia. El código de bajo nivel realiza una sola función y no conoce 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), por lo que hace exactamente eso en la finally
cláusula, asegurándose de que siempre suceda, ya sea que se haya lanzado una excepción o no.
El último bloque asegura que incluso cuando se lanza una RuntimeException (tal vez debido a algún error en el código llamado), se realizará la db.cleanup()
llamada.
Esto también se usa a menudo para evitar demasiado anidamiento:
try
{
if (foo) return false;
//bla ...
return true;
}
finally
{
//clean up
}
Especialmente cuando hay muchos puntos en los que el método regresa, esto mejora la legibilidad ya que cualquiera puede ver que el código de limpieza se llama 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 hacer una llamada para cerrar la base de datos en el bloque finalmente.
La forma en que try ... finalmente funciona, significa que el código en el bloque try se ejecuta, y el código en el bloque finalmente 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 llama a una excepción, y el método tarda tres años en ejecutarse, seguirá en el bloque final y la base de datos se cerrará.
Si alguno de los códigos en el bloque try puede generar una excepción marcada, debe aparecer en la cláusula throws de la firma del método. Si se lanza una excepción no marcada, se elimina del método.
El último bloque siempre se ejecuta, ya sea que se lance una excepción o no.
fopen
o conexión de base de datos (también en PHP)