84 votes

Comment puis-je boucler l'exception getCause() pour trouver la cause première et le message détaillé ?

J'essaie d'appeler saveOrUpdate() en hibernation pour sauvegarder les données. Comme les colonnes ont un index unique, il lance ConstraintViolationException lorsque je regarde via le débogueur Eclipse.

Étant donné que la cause première peut être différente pour chaque exception lors de l'insertion de données dans une table.
Je voulais savoir comment je peux faire une boucle / une traversée à travers getCause() pour vérifier la cause première de l'exception et son message.

Mise à jour :
Merci à tous pour votre aimable réponse, mais je veux un résultat comme dans l'image ci-dessous :
enter image description here
J'ai besoin d'accéder à message détaillé domaine.
(Je suis vraiment désolée de ne pas avoir pu rendre ma question plus claire).

Merci.

112voto

reto Points 2100

L'Apache ExceptionUtils fournir la méthode suivante :

Throwable getRootCause(Throwable throwable) 

ainsi que

String getRootCauseMessage(Throwable th)

86voto

Legna Points 141

J'utilise normalement l'implémentation ci-dessous au lieu de celle d'Apache.

Outre sa complexité, l'implémentation d'Apache renvoie null lorsqu'aucune cause n'est trouvée, ce qui m'oblige à effectuer une vérification supplémentaire pour null.

Normalement, lorsque je cherche la racine/la cause d'une exception, j'ai déjà une exception non nulle pour commencer, qui est, à toutes fins utiles, la cause de l'échec en question, si une cause plus profonde ne peut pas être trouvée.

Throwable getCause(Throwable e) {
    Throwable cause = null; 
    Throwable result = e;

    while(null != (cause = result.getCause())  && (result != cause) ) {
        result = cause;
    }
    return result;
}

27voto

SpaceTrucker Points 2897

En utilisant l'API Stream de Java 8, on peut y parvenir :

Optional<Throwable> rootCause = Stream.iterate(exception, Throwable::getCause)
                                      .filter(element -> element.getCause() == null)
                                      .findFirst();

Notez que ce code n'est pas à l'abri des boucles d'exception et qu'il doit donc être évité en production.

9voto

morgano Points 8701

Demandez-vous quelque chose comme cela ?

Throwable cause = originalException;
while(cause.getCause() != null && cause.getCause() != cause) {
    cause = cause.getCause();
}

ou ai-je oublié quelque chose ?

8voto

schnatterer Points 730

La goyave Throwables fournit les méthodes suivantes :

Throwable getRootCause(Throwable throwable)

ainsi que

String getStackTraceAsString(Throwable throwable)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X