tips/JAVA/Throwable printStackTrace() の結果を文字列として取り出す(1 of 2)
2008-03-13 (木) 01:40:42 (5860d)
Throwable printStackTrace() の結果を文字列として取り出す(1 of 2) †
デバックを行う場合など、 例外が何処で発生したかを追跡するため Throwable#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() の箇所以降に進まなくなってしまいました。 マルチスレッドの際のストリームの動作を調べれば解決するのでしょうが。。。