2012-09-24 19 views
33

Tengo un pequeño fragmento de código que se ejecuta en algunas transacciones para su procesamiento. Cada transacción está marcada con un número de transacción, que es generado por un programa externo y no está necesariamente secuenciado. Cuando detecto una Excepción en el código de procesamiento, la estoy lanzando a la clase principal y registrándola para su posterior revisión. Me gustaría agregar el número de transacción a esta excepción lanzada. ¿Es posible hacer esto mientras se mantiene el seguimiento de pila correcto?Agregar un mensaje personalizado a la excepción lanzada mientras se mantiene el seguimiento de la pila en Java

Por ejemplo:

public static void main(String[] args) { 
    try{ 
     processMessage(); 
    }catch(Exception E){ 
     E.printStackTrace(); 
    } 

} 

private static void processMessage() throws Exception{ 
    String transNbr = ""; 
    try{ 
     transNbr = "2345"; 
     throw new Exception(); 
    }catch(Exception E){ 
     if(!transNbr.equals("")){ 
      //stack trace originates from here, not from actual exception 
      throw new Exception("transction: " + transNbr); 
     }else{ 
      //stack trace gets passed correctly but no custom message available 
      throw E; 
     } 
    } 
} 

Respuesta

56

Probar:

throw new Exception("transction: " + transNbr, E); 
+1

eso es exactamente lo que estaba buscando. Gracias. – thedan

6

Hay un constructor Exception que lleva también el argumento de causa: Exception(String message, Throwable t)

Se puede utilizar para propagar la StackTrace:

try{ 
    ... 
}catch(Exception E){ 
    if(!transNbr.equals("")){ 
     throw new Exception("transction: " + transNbr, E); 
    } 
    ... 
} 
12

Las excepciones suelen ser inmutables: no puede cambiar su mensaje después de haber sido creadas. Lo que puede hacer, sin embargo, es excepciones de la cadena:

throw new TransactionProblemException(transNbr, originalException); 

El seguimiento de la pila se verá así

TransactionProblemException : transNbr 
at ... 
at ... 
caused by OriginalException ... 
at ... 
at ... 
+1

Esto es más agradable, ya que el nombre de la clase de excepción está vinculado al dominio: se reconoce de inmediato la fuente exacta del problema. Además, las herramientas de análisis de código pueden generar advertencias cuando 'arroja una nueva Excepción (...)'. – vikingsteve

0

Puede utilizar el mensaje de excepción de: -

public class MyNullPointException extends NullPointerException { 

     private ExceptionCodes exceptionCodesCode; 

     public MyNullPointException(ExceptionCodes code) { 
      this.exceptionCodesCode=code; 
     } 
     @Override 
     public String getMessage() { 
      return exceptionCodesCode.getCode(); 
     } 


    public class enum ExceptionCodes { 
    COULD_NOT_SAVE_RECORD ("cityId:001(could.not.save.record)"), 
    NULL_POINT_EXCEPTION_RECORD ("cityId:002(null.point.exception.record)"), 
    COULD_NOT_DELETE_RECORD ("cityId:003(could.not.delete.record)"); 

    private String code; 

    private ExceptionCodes(String code) { 
     this.code = code; 
    } 

    public String getCode() { 
     return code; 
    } 
} 
1

puede utilizar súper mientras se extiende Excepción

if (pass.length() < minPassLength) 
    throw new InvalidPassException("The password provided is too short"); 
} catch (NullPointerException e) { 
    throw new InvalidPassException("No password provided", e); 
} 


// A custom business exception 
class InvalidPassException extends Exception { 

InvalidPassException() { 

} 

InvalidPassException(String message) { 
    super(message); 
} 
InvalidPassException(String message, Throwable cause) { 
    super(message, cause); 
} 

}

}

source

Cuestiones relacionadas