tips/JAVA/Throwable printStackTrace() の結果を文字列として取り出す(2 of 2) の変更点


#navi(../)

* Throwable printStackTrace() の結果を文字列として取り出す(2 of 2) [#k9cfc389]


printStackTrace(PrintWriter) ではうまくいかない場合があるため、
実際には Throwable#getStackTrace() を用いる方が簡便かもしれません。
(JRE 1.4 以降)

このメソッドはスタックトレースの内容を StackTraceElement 配列として取得できます。
配列の一つ一つの内容を文字列に直せば、
printStackTrace() と同様の結果を得ることができます。
(ただしタブや改行などの整形は行う必要があります)

例)
#pre{{
public class StackTracePrintTest {
    ...
    private String getStackTraceString(Throwable ex) throws IOException {
        StringBuffer buf = new StringBuffer();
        buf.append(ex.toString());
        buf.append("\n");

        // スタックトレースの内容を取得
        StackTraceElement[] sts = ex.getStackTrace();
        for (int i = 0; i < sts.length; i++) {
            buf.append("\tat ");
            buf.append(sts[i].toString());
            buf.append("\n");
        }

        // Cause Throwable が存在する場合
        Throwable cause = ex.getCause();
        if (cause != null) {
            buf.append("Caused by: ");
            buf.append(this.getStackTraceString(cause));
        }

        return buf.toString();
    }
}
}}

上記のようにすれば、スタックトレースの内容を文字列に出力することができます。
ただし自前でこの処理を作るよりは、
やはり printStackTrace() の内容をそのまま String で返すようなメソッドが用意されていてもよいように思いますが。。。