Подтвердить что ты не робот

Как я могу пройти через Exception getCause(), чтобы найти основную причину с подробным сообщением

Я пытаюсь вызвать saveOrUpdate() в hibernate для сохранения данных. Поскольку столбцы имеют уникальный индекс, поэтому его бросает ConstraintViolationException, когда я просматриваю через отладчик Eclipse.

Поскольку корневая причина может отличаться для разных исключений, вставляя данные в таблицу.
Я хотел бы знать, как я могу пройти/пройти через getCause(), чтобы проверить, что является основной причиной исключения и его сообщением.

Обновление:
Спасибо всем за ваш добрый ответ, дело в том, что я хочу выводить, как показано ниже:
enter image description here
Мне нужно получить доступ к полю detailMessage.
(Я очень сожалею, если не смог сделать мой вопрос более ясным.)

Спасибо.

4b9b3361

Ответ 1

Apache ExceptionUtils предоставляет следующий метод:

Throwable getRootCause(Throwable throwable) 

а также

String getRootCauseMessage(Throwable th) 

Ответ 2

Я обычно использую следующую реализацию вместо 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;
}

Ответ 3

Вы просите что-то вроде этого?

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

или я что-то не хватает?

Ответ 4

Используя java 8 Stream API, это может быть достигнуто с помощью:

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

Обратите внимание, что этот код не защищен от циклов причины исключения и поэтому его следует избегать в процессе производства.

Ответ 5

Guava Throwables предоставляет следующие методы:

Throwable getRootCause(Throwable throwable)

а также

String getStackTraceAsString(Throwable throwable)

Ответ 6

} catch (Exception ex) {
    while (ex.getCause() != null)
        ex = ex.getCause();
    System.out.println("Root cause is " + ex.getMessage());
}

Вы ожидали чего-то более сложного?

Ответ 7

В 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;
}