例外のキャッチし損ないをカバーするUncaughtExceptionHandler

例外をうっかりキャッチし損ねると、ログも出力されず原因究明が困難になったりします。そんなときには、UncaughtExceptionHandlerを設定しておくと便利です。

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

例外が発生した場合はキャッチして何らかの対処を行うが、キャッチし損なうことがある。

例えば例外を集中して管理しているフレームワーク自体にバグがあり、そこからさらに例外になってしまうなどである。例外の再現性が低い場合はスタックトレースの出力がないとやっかいなことになる。標準出力にスタックトレースが表示されて助かることもあるが、環境によってはどこに出力されるかわかりづらい。

そういったことをカバ-する方法として、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);
    });
  }
}