Considerate questo codice:Le attività di JavaFX sembrano consumare eccezioni. È un bug o una funzionalità?
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();
Se corriamo il codice di eccezione di runtime non fa scattare il gestore di eccezioni di default, ma è invece consumato dal compito. L'unico modo per contrastare questo che ho trovato è quello di rigenerare l'eccezione in task.setOnFailed:
task.setOnFailed((WorkerStateEvent t) -> {
throw new RuntimeException(task.getException());
});
Dal JavaFX 8 ora ha il supporto per l'UncaughtExceptionHandler perché non è l'eccezione propagato al gestore di eccezioni?
C'è un modo per rilanciare l'eccezione senza avvolgerla in una RuntimeException? Ho provato 'throw task.getException();' ma il compilatore ha appena urlato. – user555
Non per la mia conoscenza molto limitata su JavaFX. –
No, non puoi. Come puoi vedere nella documentazione (https://docs.oracle.com/javafx/2/api/javafx/event/EventHandler.html), il metodo di gestione dell'Eventhandler non genera alcuna eccezione.Inoltre, non è possibile assegnare l'Eccezione al blocco circostante per rethrow, perché quel blocco è già stato abbandonato a causa della chiamata asincrona. –