web-dev-qa-db-fra.com

Comment puis-je parcourir Exception getCause () pour trouver la cause racine avec un message de détail

J'essaie d'appeler saveOrUpdate() en veille prolongée pour enregistrer des données. Comme les colonnes ont un index unique, il jette donc ConstraintViolationException lorsque je regarde à travers le débogueur Eclipse.

Étant donné que la cause première peut être différente pour différentes exceptions lors de l'insertion de données dans la table.
Je voulais savoir comment puis-je parcourir/parcourir getCause() pour vérifier quelle est la cause première de l'exception et de son message.

Mise à jour:
Merci à tous pour votre aimable réponse, le problème est que je souhaite une sortie comme dans l'image ci-dessous:
enter image description here
Je dois accéder au champ detailMessage.
(Je suis vraiment désolé si je ne pouvais pas clarifier ma question.)

Merci.

60
agpt

Apache ExceptionUtils fournit la méthode suivante:

Throwable getRootCause(Throwable throwable) 

aussi bien que

String getRootCauseMessage(Throwable th) 
80
reto

J'utilise normalement l'implémentation ci-dessous à la place 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 de null.

Normalement, lorsque je cherche la racine/cause d'une exception, j'ai déjà une exception non nulle pour commencer, ce qui correspond à toutes les propositions prévues est la cause de l'échec en cours, 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;
}
61
Legna

En utilisant Java 8 Stream API, vous pouvez y parvenir en:

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 de cause exceptionnelle et doit donc être évité en production.

16
SpaceTrucker

Demandez-vous quelque chose comme ça?

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

ou est-ce que je manque quelque chose?

8
morgano

Throwables de Guava fournit les méthodes suivantes:

Throwable getRootCause(Throwable throwable)

aussi bien que

String getStackTraceAsString(Throwable throwable)
7
schnatterer
} catch (Exception ex) {
    while (ex.getCause() != null)
        ex = ex.getCause();
    System.out.println("Root cause is " + ex.getMessage());
}

Vous attendiez-vous à quelque chose de plus compliqué?

3

Essayez ceci, vous pouvez mettre cette fonction dans une sorte de classe Util:

public static Throwable getRootException(Throwable exception){
 Throwable rootException=exception;
 while(rootException.getCause()!=null){
  rootException = rootException.getCause();
 }
 return rootException;
}

Exemple d'utilisation:

catch(MyException e){
  System.out.println(getRootException(e).getLocalizedMessage());
}

Source: Comment obtenir l'exception racine de toute exception

2
Mehdi

Dans Apache ; la mise en œuvre est comme ci-dessous.

La surbrillance est list.contains (throwable) == false

public static Throwable getRootCause(final Throwable throwable) {
    final List<Throwable> list = getThrowableList(throwable);
    return list.size() < 2 ? null : (Throwable)list.get(list.size() - 1);
}

public static List<Throwable> getThrowableList(Throwable throwable) {
    final List<Throwable> list = new ArrayList<Throwable>();
    while (throwable != null && list.contains(throwable) == false) {
        list.add(throwable);
        throwable = ExceptionUtils.getCause(throwable);
    }
    return list;
}
2
Kanagavelu Sugumar

Récursivement:

public static Throwable getRootCause(Throwable e) {
    if (e.getCause() == null) return e;
    return getRootCause(e.getCause());
}
1
Roman Khomyshynets