Puedo ver al detectar una excepción que puedo imprimir e.getCause()
, aunque siempre es null
.Configuración Causa de excepción en java
¿Tengo que configurarlo en algún lugar, o falta algo que está estableciendo la causa a nulo?
Puedo ver al detectar una excepción que puedo imprimir e.getCause()
, aunque siempre es null
.Configuración Causa de excepción en java
¿Tengo que configurarlo en algún lugar, o falta algo que está estableciendo la causa a nulo?
Una excepción tiene los atributos message
y cause
. El mensaje es una descripción, diciéndole a un lector humano más o menos exactamente, qué salió mal. El cause
es algo diferente: es, si está disponible, otro (anidado) Throwable
.
El concepto se utiliza a menudo si usamos excepciones personalizadas como este:
catch(IOException e) {
throw new ApplicationException("Failed on reading file soandso", e);
// ^Message ^Cause
}
Editar - en respuesta a @djangofans comentario.
El estándar es que la expresión anidada (la causa) se imprime con su seguimiento de la pila también.
La ejecución de esta pequeña aplicación
public class Exceptions {
public static void main(String[] args) {
Exception r = new RuntimeException("Some message");
throw new RuntimeException("Some other message", r);
}
}
es la salida
Exception in thread "main" java.lang.RuntimeException: Some other message
at Exceptions.main(Exceptions.java:4)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)
Caused by: java.lang.RuntimeException: Some message
at Exceptions.main(Exceptions.java:3)
... 5 more
se incluyen ambos mensajes.
clase Exception
tiene constructores que toman cause
Throwable. Debe llamar a esos constructores o proporcionarles constructores a sus clases de excepciones personalizadas que llamen a estos súper constructores.
getCause - Devuelve la causa de esta throwable o null si la causa es inexistente o desconocido. (La causa es la throwable que causó esta throwable ser expulsado.)
Leer el documento de Java: getCause
La causa se suele fijar en el constructor de la excepción. Mira public Exception(String message, Throwable cause).
Si no está configurado en el constructor, puede llamar al initCause().
¿Es posible mostrar una excepción que también muestre un rastro de pila adicional de una causa adicional? ¿No es eso lo que Vik realmente estaba preguntando? Él no estaba preguntando: mostrar la causa del mensaje, él preguntaba: mostrar causa de excepción. – djangofan
@djangofan - He agregado algunas líneas a mi respuesta. Espero eso ayude. –