4

だから私はフィルターを使用してサーブレットの例外をキャッチしています(jsf/plainサーブレットを組み合わせて使用​​しているため)

ServletException をキャッチして printstacktrace を呼び出すと、ほとんどの情報が失われます。

「真の」ルート例外は「面白い」表現の背後に隠されているようです

((ServletException) e.getRootCause().getCause()).getRootCause().getCause().getCause().getCause()

これは明らかにそれを行う方法ではありません。

このような例外の「完全な」情報を出力する簡単な方法です。例外がこのようにラップされている理由を誰かが説明できますか?

4

4 に答える 4

6

commons-langのExceptionUtilsクラスを見てください。例外のチェーン全体を出力するための便利なメソッドがいくつか含まれています。

于 2009-05-19T14:29:39.743 に答える
3

ExceptionUtils を見た後、これで問題が解決しました!

    final StringWriter stacktrace = new StringWriter();
    ExceptionUtils.printRootCauseStackTrace(throwable,new PrintWriter(stacktrace));
    msg.append(stacktrace.getBuffer());

これにより、関連するすべての情報を含む完全なスタック トレースが出力されます。

于 2009-05-19T14:41:47.410 に答える
1

これは例外連鎖と呼ばれます。例外を別の例外でラップすることにより、メインのアプリケーションクラスが低レベルの例外について心配することなく、例外がスタックをバブルアップさせることができます。

例:

public void doStuff() throws StuffException {
    try {
        doDatabaseStuff();
    } catch (DatabaseException de1) {
        throw new StuffException("Could not do stuff in the database.", de1);
    }
}

このように、アプリケーションは処理するだけで済みますが、本当に必要な場合StuffExceptionは、基盤に到達できます。DatabaseException

キャッチした例外の一番下の(および他のすべての)例外に到達するには、その根本原因を反復処理できます。

    ...
} catch (SomeException se1) {
    Throwable t = se1;
    logger.log(Level.WARNING, "Top exception", se1);
    while (t.getCause() != null) {
        t = t.getCause();
        logger.log(Level.WARNING, "Nested exception", t);
    }
    // now t contains the root cause
}
于 2009-05-19T14:20:32.210 に答える