デバックを行う場合など、例外が何処で発生したかを追跡するため
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() の箇所以降に進まなくなってしまいました。
マルチスレッドの際のストリームの動作を調べれば解決するのでしょうが。。。