2011-05-23 9 views

Respuesta

23

Sí, puedes hacer esto.

En realidad, está incluso obligado a hacerlo cuando se trata de corrientes que desea cerrar correctamente:

InputStream in = /* ... */; 
try { 
} catch (...) { 
} finally { 
    try { 
     in.close(); 
    } catch (...) { 
    } finally { 
    } 
} 

no veo ningún caso en el que esto sería una mala práctica

+0

+1 como ejemplo bueno – Alp

+0

Buen ejemplo. Pero siempre lo considero un código poco legible y trato de crear algún método o clase de utilidad que pueda cerrar instancias de Cierre con verificación nula. –

1

Parece feo, pero a veces es el camino a seguir. Según el código, considere extraer un método con el segundo bloque try-catch-finally.

1

Lo mejor es evitarlo cuando puede, pero a veces puede ser necesario. Si nos dice más acerca de por qué cree que necesita esto, podemos dar mejores respuestas :-)

Una razón para pensar puede ser realizar una transacción en el bloque finally, cuando la operación de confirmación puede lanza una excepción

Es importante tener en cuenta que las excepciones lanzadas dentro de un bloque finally pueden sombrear fácilmente las excepciones lanzadas anteriormente, dentro del bloque try, a menos que se manejen correctamente. Por lo tanto, tales bloques de prueba/captura anidados a veces son el camino a seguir. Sin embargo, como otros han señalado, para mejorar la legibilidad, es recomendable extraer el interior del bloque finally en un método diferente.

7

Para legibilidad se puede factorizar el try-catch anidado en un método separado, como:

try{ 
    }catch(){} 
    finally{ 
    cleanup(); 
    } 

Y el segundo try-catch puede estar dentro del método de limpieza.

Para apoyar el patrón anterior en el paquete de IO, java6 introduce una nueva clase llamada que se puede cerrar de que todos los flujos de poner en práctica, para que pueda tener un único método de limpieza de la siguiente manera:

public static boolean cleanup(Closeable stream) 
{ 
try{ 
    stream.close(); 
    return true; 
    }catch(){ 
    return false; 
    } 
} 
1

Es feo, pero hay los casos en los que no puede evitarlo, especialmente en la limpieza de recursos donde tiene recursos dependientes y la limpieza de un recurso puede arrojar una excepción.

Un ejemplo típico es poner en orden los objetos ResultSet, Statement y Connection en el código JDBC. Cerrando el ResultSet puede arrojar una excepción, pero aún así nos gustaría continuar y cerrar el Statement and Connection

Cuestiones relacionadas