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:
Je dois accéder au champ detailMessage.
(Je suis vraiment désolé si je ne pouvais pas clarifier ma question.)
Merci.
Apache ExceptionUtils fournit la méthode suivante:
Throwable getRootCause(Throwable throwable)
aussi bien que
String getRootCauseMessage(Throwable th)
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;
}
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.
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?
Throwables
de Guava fournit les méthodes suivantes:
Throwable getRootCause(Throwable throwable)
aussi bien que
String getStackTraceAsString(Throwable throwable)
} 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é?
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
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;
}
Récursivement:
public static Throwable getRootCause(Throwable e) {
if (e.getCause() == null) return e;
return getRootCause(e.getCause());
}