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.

3voto

Ernest Friedman-Hill Points 56605
} 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é ?

3voto

Kanagavelu Sugumar Points 1206

En APACHE ; la mise en œuvre se fait comme suit.

Le point fort 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;
}

2voto

Essayez ceci, vous pouvez placer 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 n'importe quelle exception ?

2voto

De manière récursive :

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

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