2010-02-23 6 views
8

¿Se considera una mala práctica tener múltiples intentos en un método y estructurar el código de esta manera?¿Es este tipo de mala práctica de estilo de excepción de Java?

public void whatever() { 
    try { 
    methodThatMayThrowIOException(); 
    } catch(IOException io) { 
    // do something with exception here 
    } 

    // do more stuff here that won't throw exceptions 

    try { 
    methodThatMayThrowCustomException(); 
    } catch(CustomException ce) { 
    // do something with custom exception here 
    } 
} 
+0

¿Por qué debería ser una mala práctica? Parece ordenado (es decir, solo atrapas donde tienes que hacerlo). Lo único que consideraría es arrojar la excepción fuera de 'lo que sea 'porque prefiero lanzar excepciones y ver errores cuanto antes mejor (solo captar excepciones en la capa de presentación). – helios

+3

Esto no se puede responder sin conocer más detalles. Es un buen estilo si se puede recuperar la IOException, es un estilo muy malo si no puede. –

+0

La excepción IO fue solo un ejemplo. Me preguntaba sobre múltiples intentos en un método. – Geo

Respuesta

3

Su código se lee como lo hace porque quiere hacer la parte 1 (y resolver, capturando IOException si es necesario), haga la parte sin excepciones, y luego haga el methodThatMayThrowCustomException. Su código literalmente no se puede escribir de otra manera y conserva la misma funcionalidad. Eso es una exageración, pero cualquier otra versión sería diferente en un sentido superficial.

Esta es no la misma:

public void whatever { 
    try { 
    methodThatMayThrowIOException(); 
    // do more stuff here that won't throw exceptions 
    methodThatMayThrowCustomException(); 
    } catch(IOException io) { 
    // do something with io exception here 
    } catch(CustomException ce) { 
    // do something with custom exception here 
    } 
} 

y la forma en que se ejecutaría si alguna de las excepciones son arrojados es bastante diferente. Si necesita recuperarse secuencialmente de la Parte 1, presione la Parte 2 en cualquier caso, luego continúe con la Parte 3, realmente no puede escribir su código de otra manera.

No hay nada de malo en tener dos bloques catch, aunque mezclar algo que cause una IOException con algo que arroje una CustomException podría sugerir una mezcla de preocupaciones, haciendo que su código sea difícil de entender. Pero tal como es, no es solo válido, es la única forma de hacer lo que estás haciendo.

+0

Él nunca dijo explícitamente que quiere golpear la parte 2 en cualquier caso. La parte '// do something with io exception here' podría ser' throw new WhateverException(); ', por ejemplo, en cuyo caso los múltiples bloques catch funcionarían bien y es mucho más claro. Ese es el punto que estoy tratando de hacer en mi respuesta: solo use su enfoque si realmente está aprovechando el hecho de que le permite hacer más cosas. De lo contrario, solo use el idioma estándar "más débil" (y, por lo tanto, mucho más fácil de entender) de múltiples bloques catch. – polygenelubricants

+1

@polygenelubricants, punto tomado, gracias. –

3

Se ve bien, pero depende de lo methodThatMayThrowIOException y methodThatMayThrowCustomException hacer y si el fracaso de la primera (methodThatMayThrowIOException) debe dejar todo el método whatever.

2

No veo por qué sería una mala práctica, siempre y cuando realmente haga algo útil con las excepciones que atrapó.

7

Si el método puede continuar la ejecución, sin ningún problema, incluso si se produce la excepción especificada, esto debería estar bien.

En el caso de que la excepción cause problemas más adelante en el método, lo haría burbujear.

5

No, no lo es. Es un buen punto para capturar las excepciones específicas cuando podrían ser lanzados, en mi humilde opinión, es sin duda mejor que esto:

public void whatever { 
    try { 
     methodThatMayThrowIOException(); 
     // do more stuff here that won't throw exceptions 
     methodThatMayThrowCustomException(); 
    } catch(ParentException e) { 
     // do something with custom exception here 
    } 
} 
+0

¿Cómo es esto peor si el métodoThatMayThrowCustomException() puede funcionar perfectamente bien después de que methodThatMayThrowIOException() lanzó una excepción, que se manejó? –

+0

Además, en el ejemplo, no es seguro que IOException y CustomException tengan un padre común (excepto Exception, pero la captura de Exception no sería una gran idea) –

+0

@Thomas Lötzer: ¿qué? 'methodThatMayThrowCustomException()' no se ejecutará en absoluto si 'methodThatMayThrowIOException()' arroja una excepción ... Si está hablando de una captura de prueba dentro del método, entonces está haciendo suposiciones, eso está fuera del alcance de la pregunta, creo @Valentin Rocher: no captar a un padre común (aunque sea solo Exception), es * exactamente * el punto de mi respuesta. –

0

Bueno, depende de lo que usted está tratando de lograr. normalmente encerraría un bloque de código en un solo bloque try-catch si el bloque de código se debe ejecutar como un bloque o no se ejecuta en absoluto si se produce alguna excepción. si no es el caso, entonces creo que es mucho mejor aislar los diferentes bloques de código lanzando diferentes excepciones en diferentes bloques try-catch. sandwitching "haz más cosas aquí que no arrojen excepción". ¡solo un pensamiento!

3

Realmente depende de lo que planeas hacer si se lanza una IOException. Su estilo le permite hacer más cosas, pero si en realidad no está planeando aprovechar eso, entonces esa intención se hace mucho más clara al usar la expresión estándar.

public void whatever { 
    try { 
    methodThatMayThrowIOException(); 
    // do more stuff here that won't throw exceptions 
    methodThatMayThrowCustomException(); 
    } catch(IOException io) { 
    // do something with io exception here 
    } catch(CustomException ce) { 
    // do something with custom exception here 
    } 
} 

Aquí se puede decir rápidamente que si se lanza IOException, a continuación, sólo haces lo que hay dentro del bloque catch y no mucho más.

+0

Él YA está aprovechando eso teniendo una segunda y tercera sección. –

+0

Sí, pero el primer bloque de captura podría regresar/arrojar, o podría establecer banderas de guardia que impidan que la carne y papas reales de la 2ª y 3ª sección se ejecuten, etc. – polygenelubricants

+1

Es cierto. Supuse que estaba preguntando "mi código hace exactamente lo que quiero. ¿Es esta una mala idea?" Pero estás en lo correcto. Puede que no esté haciendo exactamente lo que quiere. +1 –

1

No hay problema con esto, AFAICS. Sin embargo, 2 try-catch en un método me apuñala los ojos. Si siente lo mismo, le sugiero que lo refactorice de manera adecuada.

1

No. Es una práctica bastante buena para reducir el alcance donde se producen algunas excepciones. Hice esto mucho en mi código.

Sin embargo, si está seguro de que en un solo intento ... atrapar bloque, cierto tipo de excepción solo será lanzada por una función única, ponerlos en el mismo bloque de prueba también está bien.

0

Personalmente, creo que se ve desordenado. Prefiero tener solo una oportunidad, con tantos bloqueos de captura como necesite. No me importa o varias secuencias de prueba/captura en un solo método.

Cuestiones relacionadas