From 79478db16e845a7645219652b800e3b7995e67c0 Mon Sep 17 00:00:00 2001 From: David Gerber Date: Thu, 26 Dec 2024 11:11:23 +0100 Subject: [PATCH] Log all JavaFX runtime errors Previously they would end up in stdout, which is invisible when the app is installed and running from a launcher. A requester is also shown since most JavaFX crashes have serious consequences (dead UI, etc...) --- ui/src/main/java/io/xeres/ui/JavaFxApplication.java | 9 +++++++++ ui/src/main/java/io/xeres/ui/support/util/UiUtils.java | 4 ++-- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/ui/src/main/java/io/xeres/ui/JavaFxApplication.java b/ui/src/main/java/io/xeres/ui/JavaFxApplication.java index 47dba7ef..11a4d4e6 100644 --- a/ui/src/main/java/io/xeres/ui/JavaFxApplication.java +++ b/ui/src/main/java/io/xeres/ui/JavaFxApplication.java @@ -21,6 +21,7 @@ import io.xeres.common.mui.MinimalUserInterface; import io.xeres.ui.support.uri.UriService; +import io.xeres.ui.support.util.UiUtils; import javafx.application.Application; import javafx.stage.Stage; import org.springframework.boot.builder.SpringApplicationBuilder; @@ -65,6 +66,9 @@ public void start(Stage primaryStage) { Objects.requireNonNull(springContext); + // This allows all JavaFX crashes to show up in the logger instead of stdout + Thread.setDefaultUncaughtExceptionHandler(JavaFxApplication::handleException); + var openUrlService = springContext.getBean(UriService.class); openUrlService.setHostServices(getHostServices()); @@ -76,4 +80,9 @@ public void stop() { springContext.close(); } + + private static void handleException(Thread thread, Throwable throwable) + { + UiUtils.showAlertError(throwable); + } } diff --git a/ui/src/main/java/io/xeres/ui/support/util/UiUtils.java b/ui/src/main/java/io/xeres/ui/support/util/UiUtils.java index d5ddd43b..7be1ed9e 100644 --- a/ui/src/main/java/io/xeres/ui/support/util/UiUtils.java +++ b/ui/src/main/java/io/xeres/ui/support/util/UiUtils.java @@ -118,14 +118,14 @@ public static void showAlertError(Throwable t, Runnable action) } else { - alert(ERROR, "Error", t.getMessage(), ExceptionUtils.getStackTrace(t)); + alert(ERROR, "Error", t.getClass().getSimpleName() + ": " + t.getMessage(), ExceptionUtils.getStackTrace(t)); } if (action != null) { action.run(); } - log.error("Error: {}", t.getMessage(), t); }); + log.error("Error: {}", t.getMessage(), t); } public static void showError(Node... nodes)