2012-02-09 9 views
5

En algún código antiguo de Java, encontré una clase que contiene una gran cantidad de métodos que usan el mismo código de manejo de errores (try-catch con mucho manejo de errores, registro, etc.). Parece que el primer método simplemente se copió y luego el código en el bloque de prueba se adaptó ligeramente. Esto es lo que básicamente se parece a:¿Cómo simplificar una clase con muchos códigos de manejo de errores pegados?

public class myClass{ 

    public void doSomething() { 
     try { 
      //do something 
     } catch (Exception e) { 
      //extensive error handling 
     } 
    } 

    public void doSomethingElse() { 
     try { 
      //do something else 
     } catch (Exception e) { 
      //extensive error handling, copy-pasted from the above method 
     } 
    } 

}

¿Cómo puede ser simplificado? No quiero cambiar la interfaz de la clase (mucho), me gustaría deshacerme de los bloques de captura pegados y copiados, de modo que solo el código del bloque try permanezca dentro del método original.

Pensé en usar el patrón Método de fábrica, donde un método implementa el manejo de errores y llama al método original en el bloque try. Pero entonces, todas las llamadas tendrían que pasar por este método.

¿Alguna idea?

+1

¿Por qué no puedes simplemente poner el código común en un método que llamas desde ambos bloques catch? – John3136

+0

¿por qué no simplemente escribe un método estático en una clase de manejador de excepciones, para ser llamado en el bloque catch? entonces catch block solo tendrá un par de instrucciones (llamar al manejador de excepciones, return). – vulkanino

Respuesta

7

simplificarlo de la misma manera a simplificar todo otro código repetido: poner el código repetido en un método, y llamar al método:

public void doSomething() { 
    try { 
     //do something 
    } catch (Exception e) { 
     handleError(e); 
    } 
} 

public void doSomethingElse() { 
    try { 
     //do something else 
    } catch (Exception e) { 
     handleError(e); 
    } 
} 

private void handleError(Exception e) { 
    //extensive error handling 
} 
+0

¿Pero entonces no tiene que hacer una instancia de la excepción específica, instancia de otra excepción específica, etc.? –

1

Se podía extraer el código copia-pega en una toma método privado un Exception y un argumento.

1

En Java, probablemente lo mejor que obtendrá es simplemente extraer el contenido del bloque catch en un nuevo método. Cada método todavía tendrá que repetir:

try { 

} 
catch(Exception e) { handleError(e); } 

Si desea obtener más concisa que eso, usted tendrá que empezar a hacer algunas cosas exóticas (como el uso de macros y la ejecución de un preprocesador sobre el código).

Si estaba utilizando un lenguaje de nivel superior como Clojure o Ruby, tendría más opciones, pero Java es bastante limitado en este sentido.