83

saveOrUpdate()データを保存するために休止状態を呼び出そうとしています。列には一意のインデックスがあるため、ConstraintViolationExceptionEclipse デバッガーを介して調べるとスローされます。

テーブルにデータを挿入する際の例外によって、根本原因が異なる可能性があるためです。ループ/トラバースして、例外の根本原因とそのメッセージを確認
する方法を知りたいと思いました。getCause()

更新:
ご親切に対応していただきありがとうございます。下の画像のような出力が必要です: detailMessageフィールド
ここに画像の説明を入力
にアクセスする必要があり ます。 (私の質問をより明確にすることができなかった場合は本当に申し訳ありません。)

ありがとう。

4

9 に答える 9

110

Apache ExceptionUtilsは、次のメソッドを提供します。

Throwable getRootCause(Throwable throwable) 

としても

String getRootCauseMessage(Throwable th) 
于 2013-07-19T13:24:44.197 に答える
84

私は通常、Apache のものではなく、以下の実装を使用します。

その複雑さに加えて、原因が見つからない場合、Apache の実装は null を返すため、null の追加チェックを実行する必要があります。

通常、例外のルート/原因を探すとき、最初にnull以外の例外が既にあります.

Throwable getCause(Throwable e) {
    Throwable cause = null; 
    Throwable result = e;

    while(null != (cause = result.getCause())  && (result != cause) ) {
        result = cause;
    }
    return result;
}
于 2015-02-17T15:45:50.577 に答える
26

Java 8 Stream API を使用すると、次の方法で実現できます。

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

このコードは例外原因ループの影響を受けないため、本番環境では避ける必要があることに注意してください。

于 2016-05-16T00:56:49.340 に答える
9

このようなことを求めていますか?

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

または私は何かを逃していますか?

于 2013-07-19T13:23:31.083 に答える
8

GuavaThrowablesは次のメソッドを提供します。

Throwable getRootCause(Throwable throwable)

としても

String getStackTraceAsString(Throwable throwable)
于 2017-06-22T12:26:32.730 に答える
3
} catch (Exception ex) {
    while (ex.getCause() != null)
        ex = ex.getCause();
    System.out.println("Root cause is " + ex.getMessage());
}

もっと複雑なものを期待していましたか?

于 2013-07-19T13:24:54.173 に答える
3

アパッチで; 実装は以下のようなものです。

ハイライトは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;
}
于 2015-01-07T08:22:33.780 に答える
2

再帰的に:

public static Throwable getRootCause(Throwable e) {
    if (e.getCause() == null) return e;
    return getRootCause(e.getCause());
}
于 2019-03-26T19:07:04.220 に答える