例外をスルーして終わらないようにするUncaughtExceptionHandler

例外をうっかりキャッチし損ねると、ログも出力されず原因究明が困難になる。そんなことを防ぐには、UncaughtExceptionHandlerを設定しておくとよい。

執筆時バージョン
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 B: 改訂履歴

  • v1.0, 2014-08-19: 初稿