Modul 18 · Migration Deep Dive · Stufe 1 Fundament

Exception Handling und Logging

Catch-all, null und System.err wird nachvollziehbar in Domain Exceptions und System.Logger überführt. Die Akte zeigt nicht nur das Ziel, sondern die tatsächlichen Dateien, APIs, Dependencies, Codebelege, Tests, Risiken und Cutover-Schritte.

Exception TranslatorNull Object
1 → 2Produktionsdateien
16 → 22Java-Zeilen
1 → 1Testdateien
0 / 0Dependencies entfernt / neu
NIEDRIGRisiko · Score 0

Was sich konkret ändert

DimensionLegacyModernMigrationskonsequenz
Programmiermodellimperativ / ohne Framework-Annotationenexplizite Java-AbstraktionenAnnotationen und Containerfunktionen werden nur dort eingesetzt, wo sie eine konkrete technische Verantwortung übernehmen.
Abhängigkeiten1 direkte Dependencies1 direkte Dependencies0 neu, 0 entfernt; Versionen und transitive Auswirkungen im erfolgreichen Online-Build prüfen.
Öffentliche API1 erkannte Methoden1 erkannte MethodenMethoden werden nach fachlicher Rolle gemappt; reine Bootstrap- und Framework-Methoden sind kein fachlicher Vertrag.
Datenmodellclass LegacyCustomerLookupclass CustomerLookupService, class CustomerNotFoundExceptionFeldnamen, IDs, Null-Semantik, Gleichheit und Serialisierungsform werden separat regressionstestet.
FehlerverhaltenLegacy-Exceptions und Rückgabewerteexplizitere Fach-/Framework-FehlerabbildungFehler dürfen nicht nur technisch übersetzt werden; Status, Ursache, Retrybarkeit und Client-Vertrag müssen erhalten oder versioniert werden.
TestsBestands- und Golden-Master-TestsUnit-, Slice-, Contract- und IntegrationstestsDer Modern-Pfad wird zuerst gegen denselben fachlichen Vektor geprüft und danach um neue technische Risiken ergänzt.
BetriebLegacy-Start/Lifecyclemodernes Packaging, Health und externe KonfigurationUmstellung über kleine Adapter und Golden-Master-Tests statt Big Bang.
RollbackLegacy-Artefakt bleibt unverändertModern-Artefakt getrennt deploybarKein Rollback über Datenverlust: Schema, Nachrichten und verschlüsselte Daten müssen rückwärtslesbar oder durch Dual-Read abgesichert sein.

Fachlicher Vertrag: unverändert zu erhalten

  • Root Cause und Stacktrace bleiben erhalten.
  • Fachliche Nicht-gefunden-Fälle sind von technischen Fehlern getrennt.
  • Logs enthalten Kontext, aber keine Secrets/PII.

Hauptrisiko und Testfokus

lost root cause and unstable error contracts

cause preservation, log context and negative-path tests

Die Modernisierung gilt erst als abgeschlossen, wenn der fachliche Vertrag automatisiert belegt ist.

Verbindliches Code- und Rollenmapping

Die Zuordnung ist semantisch: Eine Legacy-Klasse kann in mehrere moderne Rollen zerlegt werden.

Legacy-Rolle / DateiModern-Rolle / DateiBedeutung
LegacyCustomerLookup.javaCustomerLookupService.java + CustomerNotFoundException.javanull/Catch-all wird explizite Fachexception plus Logging.

Legacy-Quellinventar

DateiTypAnnotationenöffentliche APIPatternZeilen
LegacyCustomerLookup.javaclass LegacyCustomerLookupString find(long id)Exception Shielding (Legacy-Antipattern-Variante) – fängt technische Fehler, verschluckt sie jedoch.16

Dependency- und Laufzeitmigration

StatusDependencyVersionScopePrüfung
BEIBEHALTENorg.junit.jupiter:junit-jupiterBOM/Parent → BOM/Parenttest → testGemeinsame Dependency; Version und Scope im effektiven POM prüfen.
Direkte POM-Daten ersetzen keinen erfolgreichen Online-Build mit transitiver SBOM- und CVE-Prüfung.

Vorher-/Nachher-Codebelege

Die folgenden Ausschnitte stammen direkt aus den enthaltenen Projekten. Dadurch ist sichtbar, welche Verantwortung tatsächlich verschoben wurde.

Legacy
LegacyCustomerLookup.java
Modern
CustomerLookupService.java + CustomerNotFoundException.java

Migrationsbedeutung: null/Catch-all wird explizite Fachexception plus Logging.

Legacy-Code

projects/18-exception-logging/legacy/src/main/java/at/aydin/lab/errors/legacy/LegacyCustomerLookup.java

package at.aydin.lab.errors.legacy;

// Design Pattern: Exception Shielding (Legacy-Antipattern-Variante) – fängt technische Fehler, verschluckt sie jedoch.
import java.util.*;

public final class LegacyCustomerLookup {
    private final Map<Long, String> data = Map.of(1L, "Aydin");
    public String find(long id) {
        try {
            return data.get(id).toUpperCase();
        } catch (Exception ex) {
            System.err.println(ex);
            return null;
        }
    }
}

Modern-Code

projects/18-exception-logging/modern/src/main/java/at/aydin/lab/errors/modern/CustomerLookupService.java

package at.aydin.lab.errors.modern;

import java.util.*;

// Design Pattern: Exception Translator
// Zweck: Technische Abwesenheit wird in eine eindeutige fachliche Exception übersetzt.
public final class CustomerLookupService {
    private static final System.Logger LOG = System.getLogger(CustomerLookupService.class.getName());
    private final Map<Long, String> data = Map.of(1L, "Aydin");
    public String find(long id) {
        return Optional.ofNullable(data.get(id)).map(String::toUpperCase).orElseThrow(() -> {
            LOG.log(System.Logger.Level.WARNING, "customerId={0} not found", id); return new CustomerNotFoundException(id);
            });
    }
}

Modern-Code

projects/18-exception-logging/modern/src/main/java/at/aydin/lab/errors/modern/CustomerNotFoundException.java

package at.aydin.lab.errors.modern;

public final class CustomerNotFoundException extends RuntimeException {
    public CustomerNotFoundException(long id) {
        super("Kunde nicht gefunden: " + id);
    }
}

Umsetzungsplan mit Qualitäts-Gates

  1. Arbeitspaket 1
    Catch-all- und null-Rückgaben inventarisieren. Nachweis: Commit/PR, automatisierter Test und aktualisierte Betriebsdokumentation.
  2. Arbeitspaket 2
    CustomerNotFoundException als stabilen Fachfehler definieren. Nachweis: Commit/PR, automatisierter Test und aktualisierte Betriebsdokumentation.
  3. Arbeitspaket 3
    Technische Exceptions an der Adaptergrenze übersetzen. Nachweis: Commit/PR, automatisierter Test und aktualisierte Betriebsdokumentation.
  4. Arbeitspaket 4
    System.err durch strukturiertes Logging ersetzen. Nachweis: Commit/PR, automatisierter Test und aktualisierte Betriebsdokumentation.
  5. Arbeitspaket 5
    Correlation-/Business-Key in Logkontext aufnehmen. Nachweis: Commit/PR, automatisierter Test und aktualisierte Betriebsdokumentation.
  6. Arbeitspaket 6
    Legacy-Swallowing erst nach negativen Pfadtests entfernen. Nachweis: Commit/PR, automatisierter Test und aktualisierte Betriebsdokumentation.

Konkreter Test- und Abnahmekatalog

IDEbenePrüfungerforderlicher Nachweis
18-EXCEPTION-LOGGING-A01Integration/ContractKein leerer Catch-Block.Automatisierter Test und CI-Protokoll
18-EXCEPTION-LOGGING-A02Integration/ContractRoot Cause ist über cause zugänglich.Automatisierter Test und CI-Protokoll
18-EXCEPTION-LOGGING-A03Integration/ContractNicht gefunden ist reproduzierbar und dokumentiert.Automatisierter Test und CI-Protokoll
18-EXCEPTION-LOGGING-A04Integration/ContractSensitive Daten erscheinen nicht im Log.Automatisierter Test und CI-Protokoll
18-EXCEPTION-LOGGING-A05Integration/ContractFehlercodes bleiben an API-Grenzen stabil.Automatisierter Test und CI-Protokoll
18-EXCEPTION-LOGGING-T01UnitFachlogik ohne Container oder externen Dienst testen.Unit-Test
18-EXCEPTION-LOGGING-T02RegressionLegacy- und Modern-Ergebnis für denselben Golden-Master-Vektor vergleichen.Vergleichsreport
18-EXCEPTION-LOGGING-T03NegativeFehlerhafte, leere und grenzwertige Eingaben prüfen.Negativtest
18-EXCEPTION-LOGGING-T04OperationsStart, Health, Shutdown und Konfigurationsfehler prüfen.Deployment-/Startprotokoll
18-EXCEPTION-LOGGING-F01Fokuscause preservation, log context and negative-path testsModulspezifischer Testreport

Risikoregister des Moduls

RisikoAuswirkungGegenmaßnahmeGate
lost root cause and unstable error contractsNIEDRIGcause preservation, log context and negative-path testsvor Cutover

Konfiguration und Ressourcen

Keine zusätzlichen Ressourcen.

Rollback und Koexistenz

Ein Compatibility Adapter kann die neue Exception vorübergehend in das alte null-/Fehlerschema übersetzen, während interne Aufrufer bereits sauber migriert sind.

Abbruchkriterien

  • Fachlicher Golden-Master weicht ab.
  • Daten-, Nachrichten- oder API-Kompatibilität ist ungeklärt.
  • Fehlerquote, Latenz oder Ressourcenverbrauch überschreiten das vereinbarte Limit.
  • Monitoring oder Rückfallpfad ist nicht funktionsfähig.

Definition of Done

Direkte Arbeitslinks

⌂ Cockpit