printStackTraceの標準出力以外の方法
ド定番なのかもしれないけど、
} catch ( Exception e ) { StringWriter sw = new StringWriter(); PrintWriter pw = new PrintWriter( sw ); e.printStackTrace( pw ); logger.error( sw.toString() ); }
ってやればStringWriterの中にprintStackTraceの値が入る。
これをtoStringすればいいわけだ。
これをやっててふと思ったのだが、
StringWriterってWriterなのに、closeってコールしなくていいものか と。
そこで、StringWriter#closeに飛んでみた。
/** * Closing a <tt>StringWriter</tt> has no effect. The methods in this * class can be called after the stream has been closed without generating * an <tt>IOException</tt>. */ public void close() throws IOException { }
JavaDocみても実装を見ても、何もしないよって。
なんかメモリ上の話しだし、よく考えてみれば当たり前なんだけど、
改めてよく見てみないとわからないもんだねぇ。
ちなみにPrintWriter#closeは
public void close() { try { synchronized (lock) { if (out == null) return; out.close(); out = null; } } catch (IOException x) { trouble = true; } }
で、コンストラクタで渡したWriterにたいしてcloseをしているだけなので、
今回の場合は、StringWriterなので、結果closeしても意味がないというわけでした。