verificadas todas tipos salida propagacion personalizadas manejo las excepciones entrada ejemplos arbol java exception-handling aop

java - todas - Manejo de excepciones AOP



tipos de excepciones en java netbeans (4)

@ 4herpsand7derpsago Si lo que está intentando hacer es atrapar la excepción lanzada utilizando AOP para realizar varias tareas para manejarlo y luego volver al código donde se lanzó la excepción originalmente, creo que no entiende el concepto de AOP.

Como señala en su código

HerpDerp hd = null; if(hd == null) throw new RuntimeException("Herpyl derp!"); Manny.pacquiao();

Si quieres que AOP atrape tu RuntimeException , realiza algunas tareas para manejarlo y vuelve a Manny.pacquiao(); , la respuesta es que no puedes . La razón se debe a que cuando AOP lanza la RuntimeException , la pila ya está en su código AOP. no se puede volver a ejecutar Many.pacquiao(); . La única forma si desea continuar ejecutando Many.pacquiao(); es mediante el uso try-finally bloque try-finally como sigue

HerpDerp hd = null; try { if(hd == null) throw new RuntimeException("Herpyl derp!"); } finally { Manny.pacquiao(); }

Solo entonces se Many.pacquiao() su Many.pacquiao() , pero antes de que su AOP capture la RuntimeException

Veo que Guice y Spring usan AOP Alliance bajo el capó para las intercepciones de métodos, y he estado tratando de averiguar cómo lograr que AOP Alliance intercepte y maneje ciertas excepciones para no tener que seguir escribiendo el mismo código una y otra vez. Una vez más dentro de cada bloque de catch .

Pero después de revisar el juego, no parece que AOP Alliance proporcione ninguna manera de interceptar los Throwable s lanzados de tal manera que el controlador / interceptor pueda hacer algunas cosas (registrar la excepción, etc.) y luego determinar si debe o no siga propagando la excepción o simplemente recupérela de nuevo a la siguiente línea que sigue a la línea que lanzó la excepción :

HerpDerp hd = null; if(hd == null) throw new RuntimeException("Herpyl derp!"); Manny.pacquiao();

Estoy buscando un mecanismo de manejo de excepciones AOP que intercepte la excepción RuntimeException y use la lógica de negocios para decidir si continuar propagándola o recuperarse en la llamada Manny.pacquioa() .

  • Si simplemente no es posible hacer esto en Java, hágamelo saber
  • Independientemente de si es posible o no hacer esto en Java, ¿hay una manera de interceptar la Excepción lanzada con AOP Alliance o tengo que ir a otro lugar? Y si tengo que ir a otro lado, ¿a dónde? AspectJ?

¡Gracias!


Hay una razón por la que esto no existe. Requeriría volver a escribir la estructura de bloque de su código como si hubiera escrito el bloque try / catch en primer lugar. Esto, me parece, puede causar estragos en el alcance variable y otras cosas. Le está pidiendo a AOP que reescriba el código de bytes para que sea algo así como el siguiente código, y eso es bastante reescritura.

HerpDerp hd = null; try { if(hd == null) throw new RuntimeException("Herpyl derp!"); } catch(RuntimeException e) { if (someConditionIsMet) { throw e; } } Manny.pacquiao();


Para "atrapar" excepciones no detectadas con AspectJ, puede usar el siguiente aspecto:

pointcut uncaughtExceptionScope() : (execution(* com.mycompany.myrootpackage..Main.main(..)) || execution(* java.util.concurrent.Callable+.call()) || execution(* java.lang.Runnable+.run()) )); after() throwing(Throwable t) : uncaughtExceptionScope() && !cflow(adviceexecution()) { handleException(thisJoinPoint, t); } protected void handleException(JoinPoint jp, Throwable t) { // handle exception here }

No creo que sea posible "volver" al punto de ejecución.


Puede detectar excepciones con Spring AOP, pero no sé si eso coincide con su requisito de un marco de Java puro.

Con Spring, puedes escribir un interceptor AOP simple como algo así como:

@Aspect public class ErrorInterceptor{ @AfterThrowing(pointcut = "execution(* com.mycompany.package..* (..))", throwing = "ex") public void errorInterceptor(WidgetException ex) { if (logger.isDebugEnabled()) { logger.debug("Error Message Interceptor started"); } // DO SOMETHING HERE WITH EX logger.debug( ex.getCause().getMessage()); if (logger.isDebugEnabled()) { logger.debug("Error Message Interceptor finished."); } } }

pero no hay manera de volver al método de llamada o continuar con el procesamiento en la línea posterior. Sin embargo, si maneja la excepción aquí, no hará estallar la cadena a menos que lo haga usted mismo.