2011-03-29 12 views
9

Soy nuevo en Java y excepciones en general.¿Cómo me sumo a una excepción de Java?

En mis días anteriores de programación C/Perl, cuando escribí una función de biblioteca, los errores fueron transmitidos por una bandera booleana, más algún tipo de cadena con un mensaje de error amigable para los humanos (o programador). Java y C++ tienen excepciones, lo cual es útil porque incluyen rastros de pila.

A menudo me parece que cuando encuentro una excepción, quiero agregar mis dos centavos, y luego transmitirla.

¿Cómo se puede hacer esto? No quiero tirar todo el rastro de la pila ... No sé qué tan profundo ocurrió el fallo y por qué razón.

Tengo una pequeña biblioteca de utilidad para convertir una pista de pila (de un objeto Exception) en una cadena. Supongo que podría añadir esto a mi nuevo mensaje de excepción, pero parece un truco.

A continuación se muestra un método de ejemplo. Consejos?


    public void foo(String[] input_array) { 
     for (int i = 0; i < input_array.length; ++i) { 
      String input = input_array[i]; 
      try { 
       bar(input); 
      } 
      catch (Exception e) { 
       throw new Exception("Failed to process input [" 
         + ((null == input) ? "null" : input) 
         + "] at index " + i + ": " + Arrays.toString(input_array) 
         + "\n" + e); 
      } 
     } 
    } 
+0

Peter: Gracias por la sugerencia. Yo haré eso. – kevinarpe

Respuesta

26

Las excepciones pueden ser encadenados:

try { 
    ... 
} catch (Exception ex) { 
    throw new Exception("Something bad happened", ex); 
} 

Se hace excepción original del causa de la nueva. Causa de excepción se puede obtener utilizando getCause(), y llamando printStackTrace() en la nueva excepción imprimirá:

 
Something bad happened 
... its stacktrace ... 
Caused by: 
... original exception, its stacktrace and causes ... 
+1

¿Es una mejor práctica ajustar la extensión como IOException con una excepción más general en este caso Exception? – metdos

4

Normalmente se lanza una nueva excepción que incluye la edad excepción como una "causa". La mayoría de las clases de excepción tienen un constructor que acepta una excepción de "causa". (Puede obtener esto a través del Throwable.getCause().)

Tenga en cuenta que casi nunca debe capturar solo Exception - en general, debería detectar un tipo más específico de excepción.

0

Puede añadir la causa que subyace a una excepción de nueva creación:

throw new Exception("Failed to process input [" 
       + ((null == input) ? "null" : input) 
       + "] at index " + i + ": " + Arrays.toString(input_array) 
       + "\n" + e.getMessage(), e); 
1

sólo tiene que utilizar un constructor diferente:

Exception(String message, Throwable cause) 

El mensaje es el "dos centavos" y que incluya la excepción atrapado , que se mostrará en una impresión de stacktrace

Cuestiones relacionadas