Définition de la cause d'exception en java
Je peux voir en attrapant une exception que je peux imprimer e.getCause()
, bien que ce soit toujours null
.
Dois-je le définir quelque part, ou quelque chose manque-t-il qui définit la cause sur null?
4 answers
, Une Exception a les attributs message
et cause
. Le message est une description, dire à un lecteur humain plus ou moins exactement, ce qui a mal tourné. Le cause
est quelque chose de différent: il est, si disponible, un autre Throwable
(imbriqué).
Le concept est souvent utilisé si nous utilisons des exceptions personnalisées comme ceci:
catch(IOException e) {
throw new ApplicationException("Failed on reading file soandso", e);
// ^ Message ^ Cause
}
Edit - en réponse au commentaire @djangofans.
La norme est que l'expression imbriquée (la cause) est également imprimée avec sa trace de pile.
Courir ce petit demande
public class Exceptions {
public static void main(String[] args) {
Exception r = new RuntimeException("Some message");
throw new RuntimeException("Some other message", r);
}
}
Produira
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
Les deux messages sont inclus.
La cause est généralement définie dans le constructeur de l'exception. Regardez exception publique(message de chaîne, cause lancable) .
S'il n'est pas défini dans le constructeur, vous pouvez appeler initCause().
Classe Exception
a des constructeurs qui prennent un cause
Throwable. Vous devez appeler ces constructeurs ou fournir des constructeurs à vos classes d'exceptions personnalisées qui appellent ces super constructeurs.
GetCause - Renvoie la cause de ce throwable ou null si la cause est inexistante ou inconnue. (La cause est le throwable qui a provoqué le throwable.)
Lire le document Java: getCause