From 4bbee57d41498aafa590b784e6281c2b4fc04e8d Mon Sep 17 00:00:00 2001 From: Marcus van Elst Date: Tue, 28 Apr 2026 15:43:52 +0200 Subject: [PATCH] Fix #58: Verschluckte Exception in ResolveHistoricalFileName loggen Catch von Exception auf RuntimeException eingeengt; unerwartete Laufzeitfehler werden jetzt per logger.warn() protokolliert und weiterpropagiert statt still verschluckt zu werden. Co-Authored-By: Claude Sonnet 4.6 --- ...faultResolveHistoricalFileNameUseCase.java | 31 ++++++++++++------- 1 file changed, 20 insertions(+), 11 deletions(-) diff --git a/pdf-umbenenner-application/src/main/java/de/gecheckt/pdf/umbenenner/application/usecase/DefaultResolveHistoricalFileNameUseCase.java b/pdf-umbenenner-application/src/main/java/de/gecheckt/pdf/umbenenner/application/usecase/DefaultResolveHistoricalFileNameUseCase.java index ea42942..6c2b31e 100644 --- a/pdf-umbenenner-application/src/main/java/de/gecheckt/pdf/umbenenner/application/usecase/DefaultResolveHistoricalFileNameUseCase.java +++ b/pdf-umbenenner-application/src/main/java/de/gecheckt/pdf/umbenenner/application/usecase/DefaultResolveHistoricalFileNameUseCase.java @@ -3,6 +3,9 @@ package de.gecheckt.pdf.umbenenner.application.usecase; import java.util.Objects; import java.util.Optional; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + import de.gecheckt.pdf.umbenenner.application.port.in.ResolveHistoricalFileNameUseCase; import de.gecheckt.pdf.umbenenner.application.port.out.DocumentRecordLookupResult; import de.gecheckt.pdf.umbenenner.application.port.out.DocumentRecordRepository; @@ -10,20 +13,24 @@ import de.gecheckt.pdf.umbenenner.application.port.out.DocumentTerminalSuccess; import de.gecheckt.pdf.umbenenner.domain.model.DocumentFingerprint; /** - * Default implementation of {@link ResolveHistoricalFileNameUseCase}. + * Standardimplementierung von {@link ResolveHistoricalFileNameUseCase}. *

- * Queries the {@link DocumentRecordRepository} for the master record of the given fingerprint. - * If the record represents a document that previously reached a successful terminal state, - * the last known target filename ({@code lastTargetFileName}) is returned. + * Fragt den {@link DocumentRecordRepository} nach dem Stammsatz des angegebenen + * Fingerprints ab. Ist der Stammsatz terminal erfolgreich, wird der zuletzt + * geschriebene Zieldateiname zurückgegeben. *

- * For all other terminal states (e.g. documents that finally failed without ever producing - * a target copy) or when no master record exists, an empty {@link Optional} is returned. - * Technical failures during the repository lookup are caught silently and treated as - * an absent result so that the calling GUI layer is never forced to handle exceptions - * from this query path. + * Für alle anderen terminalen Zustände oder wenn kein Stammsatz vorhanden ist, + * wird ein leeres {@link Optional} zurückgegeben. + * Unerwartete {@link RuntimeException}s aus dem Repository werden geloggt (WARN) und + * weiterpropagiert. Erwartete Lookup-Fehler werden als + * {@code PersistenceLookupTechnicalFailure} im Rückgabewert kodiert und führen + * zu einem leeren {@link Optional}. */ public class DefaultResolveHistoricalFileNameUseCase implements ResolveHistoricalFileNameUseCase { + private static final Logger logger = + LogManager.getLogger(DefaultResolveHistoricalFileNameUseCase.class); + private final DocumentRecordRepository documentRecordRepository; /** @@ -62,8 +69,10 @@ public class DefaultResolveHistoricalFileNameUseCase implements ResolveHistorica return Optional.ofNullable(success.record().lastTargetFileName()); } return Optional.empty(); - } catch (Exception e) { - return Optional.empty(); + } catch (RuntimeException e) { + logger.warn("Unerwarteter Fehler beim Lesen des historischen Dateinamens für Fingerprint {}: {}", + fingerprint, e.getMessage(), e); + throw e; } } }