Ответ 1
Apache ExceptionUtils предоставляет следующий метод:
Throwable getRootCause(Throwable throwable)
а также
String getRootCauseMessage(Throwable th)
Я пытаюсь вызвать saveOrUpdate()
в hibernate для сохранения данных. Поскольку столбцы имеют уникальный индекс, поэтому его бросает ConstraintViolationException
, когда я просматриваю через отладчик Eclipse.
Поскольку корневая причина может отличаться для разных исключений, вставляя данные в таблицу.
Я хотел бы знать, как я могу пройти/пройти через getCause()
, чтобы проверить, что является основной причиной исключения и его сообщением.
Обновление:
Спасибо всем за ваш добрый ответ, дело в том, что я хочу выводить, как показано ниже:
Мне нужно получить доступ к полю detailMessage.
(Я очень сожалею, если не смог сделать мой вопрос более ясным.)
Спасибо.
Apache ExceptionUtils предоставляет следующий метод:
Throwable getRootCause(Throwable throwable)
а также
String getRootCauseMessage(Throwable th)
Я обычно использую следующую реализацию вместо Apache.
Кроме того, сложность реализации Apache возвращает null, когда причина не найдена, что заставляет меня выполнить дополнительную проверку для null.
Обычно, когда вы ищете исключение root/, у меня уже есть исключение, отличное от нуля, для начала, которое для всех предполагаемых предложений является причиной сбоя, если невозможно найти более глубокую причину.
Throwable getCause(Throwable e) {
Throwable cause = null;
Throwable result = e;
while(null != (cause = result.getCause()) && (result != cause) ) {
result = cause;
}
return result;
}
Вы просите что-то вроде этого?
Throwable cause = originalException;
while(cause.getCause() != null) {
cause = cause.getCause();
}
или я что-то не хватает?
Используя java 8 Stream API, это может быть достигнуто с помощью:
Optional<Throwable> rootCause = Stream.iterate(exception, Throwable::getCause).filter(element -> element.getCause() == null).findFirst();
Обратите внимание, что этот код не защищен от циклов причины исключения и поэтому его следует избегать в процессе производства.
Guava Throwables
предоставляет следующие методы:
Throwable getRootCause(Throwable throwable)
а также
String getStackTraceAsString(Throwable throwable)
} catch (Exception ex) {
while (ex.getCause() != null)
ex = ex.getCause();
System.out.println("Root cause is " + ex.getMessage());
}
Вы ожидали чего-то более сложного?
В APACHE; реализация подобна ниже.
Выделение 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;
}