Рассмотрим этот код:
Thread.setDefaultUncaughtExceptionHandler((Thread t, Throwable e) -> {
System.out.println("An exception occurred!");
});
// set the exception handler for the JavaFX application thread
Thread.currentThread().setUncaughtExceptionHandler((Thread t, Throwable e) -> {
System.out.println("An exception occurred!");
});
Task<?> task = new Task() {
@Override
public Void call() throws Exception {
throw new RuntimeException("foobar");
};
};
new Thread(task).start();
Если мы запустим код, исключение во время выполнения никогда не запускает обработчик исключений по умолчанию, а вместо этого потребляется задачей. Единственный способ противодействовать этому, который я нашел, - это перестроить исключение в task.setOnFailed:
task.setOnFailed((WorkerStateEvent t) -> {
throw new RuntimeException(task.getException());
});
Так как JavaFX 8 теперь поддерживает UncaughtExceptionHandler, почему исключение не распространяется на обработчик исключений?