2012-01-10 8 views
7

Me pregunto si hay una forma en Java (código puro, no algo de Eclipse) a "azúcar sintáctico" hasta el código de captura repetitiva. A saber, tengo que envolver un montón de funcionesazúcar sintáctico try-catch en java

public void foo(){ 
    try{ 
     // bla 
    } catch (Exception e) { 
      System.out.println("caught exception:"); 
      e.printStackTrace(); 
    } 
} 

public void bar(){ 
    try{ 
     // other bla 
    } catch (Exception e) { 
      System.out.println("caught exception:"); 
      e.printStackTrace(); 
    } 
} 

y así sucesivamente. Me gustaría escribir

@excepted public void foo(){ 
// bla 
} 

@excepted public void bar(){ 
// other bla 
} 

Creo que el azúcar de este tipo era posible en python. ¿Es posible en Java?

+3

Capturar y simplemente eliminar una excepción a stdout es generalmente una mala idea. En su lugar, * no * detecta la excepción (dejándola al código de llamada) o la maneja según corresponda. No hay abstracción real disponible para "manejarlo según corresponda", ya que varía según el contenido de "bla". –

+0

Si no va a hacer nada específico para manejar una excepción no detectada, puede envolver todo el programa en un solo try/catch – Matthew

+0

Capturar una 'Exception' general generalmente es una idea pobre, también, a menos que esté escribiendo framework código de algún tipo. –

Respuesta

4

No se puede hacer algo como el pseudocódigo sugiere con anotaciones, pero se puede hacer el método (s) throw:

public void bar() throws Exception {} 

y dejar que la burbuja hasta el final, la captura siempre que lo desee para, más arriba en el árbol de llamadas (o en la pila de llamadas, si lo prefiere).

+1

Daría esto a +1 * si * no estuviera lanzando 'Excepción', sino más bien tipos de excepciones más específicos. Me doy cuenta de que la pregunta del OP se refería a 'Exception', pero no creo que debamos alentarla. Piensa en el pobre tipo que tiene que codificar en esta interfaz. Él/ella tiene que atrapar y manejar una 'Excepción' general ahora también. –

+0

Para el registro, no estoy de acuerdo con eso en absoluto; Prefiero tipos específicos de 'Excepción' también, si deben declararse para ser lanzados. Todas nuestras excepciones son 'RuntimeException', por lo que no es necesario declararlas (¡pero deben estar documentadas por el API!) – sarumont

+0

Bueno, declarar métodos privados como' throws Exception', aunque no es exactamente elegante, no parece malo a mi. – gpeche

1

Para la primera parte de su pregunta, en Java 7 hay un nuevo azúcar sintáctico para detectar excepciones repetitivas, eche un vistazo a este article.

Para la segunda parte de su pregunta, me temo que no existe tal cosa en Java.

2

Concluye el try/catch en una clase/método que acepte una interfaz. Pasar una implementación anónima a esa clase/método. Realmente solo es bueno cuando se trata de la excepción, de lo contrario es similarmente ruidoso.

También podría jugar juegos de AOP/bytecode, según el caso de uso real.

1

Mi sugerencia es declarar los métodos con throws Exception o capturarlos y volver a lanzarlos como RuntimeExceptions.

Solo capturar e imprimir Exceptions es una mala idea en la práctica porque continúa ejecutándose a pesar de no haber hecho nada para recuperarse del Exception. Aunque el código sigue funcionando bien, pronto tendrá un archivo de registro lleno de cientos de excepciones y se convertirá en casi sin valor para la depuración y la búsqueda de información útil en.

try { 
    ... 
} catch (Exception e) { 
    System.out.println("caught exception:"); 
    e.printStackTrace(); 
} 
0

Por el bien de esta respuesta, supondrá que

  1. le dan una Base de clase con un montón de métodos no finales que arrojan Excepciones.
  2. se supone que debes preparar una clase Extiende que extiende Base pero cambia el comportamiento de algunos métodos para registrar excepciones en lugar de lanzarlas.
  3. tiene acceso al código fuente de Base y puede hacer modificaciones.

Puede escribir un procesador de anotaciones. Coloque una anotación en la clase Base que le indique al procesador que haga la clase de Extensión. Luego, en algunos métodos, ponga una anotación diciéndole al procesador que registre excepciones en lugar de arrojarlas.

Esto puede ser más trabajo (escribir y depurar el procesador) de lo que ahorra, dependiendo de sus circunstancias.

También puede lograr el resultado deseado escribiendo InvocationHandler y usando Proxy.

Cuestiones relacionadas