2012-07-02 5 views
5

¿Alguien sabe si hay una forma de generar código diferente en el bloque catch automáticamente dependiendo de la excepción?Personalizar la plantilla de código Try/Catch basada en la excepción

La función Eclipse 'Surround with try/catch' genera un bloque try/catch que solo incluye el volcado de un rastro de pila.

Estoy haciendo un montón de cosas similares en el código, por lo que la mayoría de mis excepciones se reducirán a probablemente tres o más tipos diferentes. Me gustaría tener diferentes códigos de bloque de captura para cada uno y tener el formato automático de eclipse basado en la excepción.

Por ejemplo: si mi código genera una RemoteConnectionException Me gustaría mostrar un cuadro de diálogo para que el usuario vuelva a conectar. Si genera una RemoteContentException, me gustaría iniciar sesión.

(I hizo estas arriba.)

Gracias de antemano

ACTUALIZACIÓN: He estado hurgando y tienen dos posibles soluciones.

1) He encontrado algo llamado el complemento de código rápido que podría hacer lo que estoy buscando. http://fast-code.sourceforge.net/index.htm

2) Para manejar excepciones específicamente, probablemente solo escriba un controlador genérico de excepción y modifique el código catch block para pasar la excepción a eso en lugar de imprimir el seguimiento de la pila. Luego, el código java determinará qué acción tomar según el tipo de excepción.

+1

'catch (RemoteConnectionException & exc) {if (handleRemoteConnectionException (exc) == false) throw;}' –

Respuesta

4

Las plantillas tienen sus límites. Sin embargo, su problema se puede resolver muy elegantemente con Aspect. (http://www.eclipse.org/aspectj/) Simplemente crea una nueva anotación para cada tipo de "template-case" que necesites y utiliza un consejo de alrededor.

Ps: no use printStackTrace() para syserr/sysout. Hay tantos grado de producción, marcos de tala ligeros .... pleeeaseee ... no abusan pobre System.out/err :)

EDIT:

Algunos ejemplo para un asesoramiento explotación y/o la evaluación comparativa . (nota:. Estoy usando AOP primavera de aspectos, y Lombok para facilitar el acceso a la infraestructura de registro El código getCurrentUser() no es realmente relevante aquí, es sólo para conseguir que el usuario actual desde la primavera de Seguridad)

package com.XXXXXXXX.aspects; 

import lombok.extern.slf4j.Slf4j; 
import org.aspectj.lang.ProceedingJoinPoint; 
import org.aspectj.lang.annotation.Around; 
import org.aspectj.lang.annotation.Aspect; 
import org.aspectj.lang.annotation.Pointcut; 
import org.springframework.security.core.context.SecurityContextHolder; 
import org.springframework.security.core.userdetails.UserDetails; 
import org.springframework.stereotype.Component; 

@Component 
@Aspect 
@Slf4j 
public class LoggerAspect { 

    private final static String DOMAIN = "XXXXXXXX"; 

    private static String getCurrentUser() { 
     String username = "Unknown"; 
     try { 
      Object principal = SecurityContextHolder.getContext(). 
        getAuthentication(). 
        getPrincipal(); 
      if (principal instanceof UserDetails) { 
       username = ((UserDetails) principal).getUsername(); 
      } else { 
       username = principal.toString(); 
      } 
     } catch (Exception e) { 
     } 
     return username; 
    } 

    @Pointcut("within(com.XXXXXXXX.services..*)") 
    public void inServiceLayer() { 
    } 

    @Pointcut("execution(* getMatcherInfo(..)) || execution(* resetCounter(..))") 
    public void notToAdvise() { 
    } 

    @Around("com.XXXXXXXX.aspects.LoggerAspect.inServiceLayer() && !com.XXXXXXXX.aspects.LoggerAspect.notToAdvise()") 
    public Object doLogging(ProceedingJoinPoint pjp) 
      throws Throwable { 
     long start = System.nanoTime(); 
     StringBuilder sb = new StringBuilder(DOMAIN); 
     sb.append('/'). 
       append(getCurrentUser()). 
       append(" accessing "). 
       append(pjp.getSignature(). 
       getDeclaringTypeName()). 
       append('.'). 
       append(pjp.getSignature(). 
       getName()); 
     log.trace("START: " + sb.toString()); 
     Object retVal = pjp.proceed(pjp.getArgs()); 
     long duration = System.nanoTime() - start; 
     log.trace("STOP: " + duration/1000000 + " msec. " + sb.toString()); 
     return retVal; 
    } 
} 
+0

Deshacerme de ese estúpido rastro de pila de impresión es exactamente la razón por la que quiero personalizar la plantilla.^_^ He estado en operaciones durante más de una década y estoy consternado por la frecuencia con que los desarrolladores vuelcan un seguimiento de pila cuando deberían manejar la excepción. Puedo entenderlo si es algo totalmente inesperado, pero ya sabes, cuando estás accediendo a un archivo, por ejemplo. Hay algunos casos de fallas esperadas que se manejan fácilmente.^ _^ – TheSporkboy

+0

¿Qué es Aspect? Aspect4j? Lo estoy buscando, pero lo que veo no estoy seguro de lo que estás hablando. – TheSporkboy

+0

@ user1497207: agregó un enlace de aspecto a la respuesta –

0

No estoy seguro de si existe tal opción disponible en Eclipse. He estado utilizando el entorno con la opción de prueba/captura durante bastante tiempo y siempre vuelca la línea predeterminada e.printStackTrace() en el bloque catch para la Excepción e.

+0

Puede cambiar la plantilla pero no puede hacer que sea una excepción específica. Normalmente lo cambio a algo que me da error de compilación (por lo que me veo obligado a agregar un bloque catch) –

Cuestiones relacionadas