例外をスルーして終わらないようにするUncaughtExceptionHandler
例外をうっかりキャッチし損ねると、ログも出力されず原因究明が困難になる。そんなことを防ぐには、UncaughtExceptionHandlerを設定しておくとよい。
Table of Contents
この記事は最終更新から3年以上経過しています。
執筆時バージョン
Java | Java SE 8 |
例外が発生した場合はキャッチして何らかの対処を行うが、うっかりキャッチし損なうことがある。
例えば例外を集中して管理しているフレームワーク自体にバグがあり、そこからさらに例外になってしまうなど。例外の再現性が低い場合はスタックトレースの出力がないとやっかいなことになる。標準出力にスタックトレースが表示されて助かることもあるが、環境によってはどこに出力されるかわかりづらい。
そういったことをカバ-する方法として、UncaughtExceptionHandlerを設定する。キャッチされない例外によりスレッドが終了する直前に、UncaughtExceptionHandler#uncaughtException()を呼び出してくれる。なのでこのメソッドでログ出力するなどしておけば、何らかの対処や出力ができるはず。
UncaughtExceptionHandlerの設定例
Threadクラスにsetterが用意されているので、そこでセットするだけでOK。メインスレッド以外のスレッドでも設定可能。
メインスレッドでのUncaughtExceptionHandlerの設定
public class UncaughtExceptionHandlerSample {
private static final Logger log =
LoggerFactory.getLogger(UncaughtExceptionHandlerSample.class);
public static void main(String[] args) {
Thread current = Thread.currentThread();
current.setUncaughtExceptionHandler((Thread thread, Throwable throwable) -> {
log.error("キャッチできない例外発生", throwable);
});
}
}
Appendix A: 参考
Appendix B: 改訂履歴
-
v1.0, 2014-08-19: 初稿