« cygwin で java -jar コマンドを使用する際の注意点 | メイン | Throwable#printStackTrace() の結果を文字列として取り出す(2/2) »

2006年08月24日

Throwable#printStackTrace() の結果を文字列として取り出す(1/2)

デバックを行う場合など、例外が何処で発生したかを追跡するため printStackTrace() メソッドを使用しますが、 通常このメソッドは標準エラー出力にしか出力されません。 ログファイルに残したり、(コンソールではなく)ウェブ画面やGUI上に表示したい場合など 文字列に出力できるとよいのですが、標準では用意されていません。

方法の一つとして、Throwable#printStackTrace(PrintStream) や Throwable#printStackTrace(PrintWriter) を使用する方法があります。 引数に指定したストリームに結果を出力させることができるため、 Pipe ストリームを利用して結果をストリームから取り出すことができます。

例)

import java.io.BufferedReader;
import java.io.IOException;
import java.io.PipedReader;
import java.io.PipedWriter;
import java.io.PrintWriter;
import java.io.Reader;

public class StackTracePrintTest {
    ...
    private String getStackTraceString(Throwable e) throws IOException {
        // Pipe ストリームで出力ストリームと入力ストリームを接続する。
        PipedWriter pipeOut = new PipedWriter();
        PipedReader pipeIn = new PipedReader(pipeOut);
        PrintWriter out = new PrintWriter(pipeOut);

        // Throwable の printStackTrace メソッドで出力ストリームに書き出す。
        e.printStackTrace(out);
        out.flush();
        out.close();

        // 入力ストリームから結果を取得する。
        BufferedReader is = new BufferedReader(pipeIn);
        StringBuffer buf = new StringBuffer();
        String line;
        while ((line = is.readLine()) != null) {
            buf.append(line);
        }

        return buf.toString();
    }
}

上記の例の getStackTraceString メソッドで、 Throwable からスタックトレース情報を取得することが出来ます。

ただし、実際にこの処理をアプリケーション内で使おうとしたとき (おそらくマルチスレッドの状態で使うと) e.printStackTrace() の箇所以降に進まなくなってしまいました。 マルチスレッドの際のストリームの動作を調べれば解決するのでしょうが。。。

投稿者 kyohei : 2006年08月24日 21:39

トラックバック

このエントリーのトラックバックURL:
http://240k.jp/cgi-bin/MT333/mt-tb.cgi/343

コメント

コメントしてください




保存しますか?