Fehlerbehandlung, Logging und feldbezogene Validierung (Kapitel 13.2)
Zentrale Exception-Behandlung (Dispatcher.UIThread.UnhandledException, AppDomain, TaskScheduler) verhindert Abstürze und protokolliert Fehler über AppLogger in eine rotierende Log-Datei im App-Datenverzeichnis. Toast-Benachrichtigungen zeigen Erfolg/Fehler global an. Alle Dialoge mit Formularfeldern zeigen Validierungsmeldungen jetzt direkt am betroffenen Feld statt in einem Sammel-Label. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
@@ -491,10 +491,43 @@ Fächer- und Kompetenzverwaltung existiert bereits in
|
||||
`.ToUniversalTime()` auf beiden Seiten vor dem Vergleich.
|
||||
|
||||
### 13.2 Fehlerbehandlung & Logging
|
||||
- [ ] **13.2.1** Zentrale Exception-Behandlung mit verständlicher Fehlermeldung statt Absturz.
|
||||
- [ ] **13.2.2** Logging in Datei im App-Datenverzeichnis, mit Rotation.
|
||||
- [ ] **13.2.3** Einheitliche Benachrichtigungen (Toast/Snackbar) für Erfolg und Fehler.
|
||||
- [ ] **13.2.4** Validierungsmeldungen einheitlich an den Eingabefeldern statt in Sammel-Labels.
|
||||
- [x] **13.2.1** Zentrale Exception-Behandlung mit verständlicher Fehlermeldung statt Absturz —
|
||||
[GlobalExceptionHandler.cs](LehrerApp.Desktop/Services/GlobalExceptionHandler.cs).
|
||||
`Dispatcher.UIThread.UnhandledException` fängt Fehler aus Befehlen/Ereignis-Handlern auf
|
||||
dem UI-Thread ab, protokolliert sie und setzt `Handled = true` — die App stürzt dabei
|
||||
nachweislich nicht ab (per Headless-Test verifiziert: Fehler in einem Dispatcher-Callback
|
||||
wird geloggt + als Toast angezeigt, App läuft weiter). `AppDomain.UnhandledException` und
|
||||
`TaskScheduler.UnobservedTaskException` sind Sicherheitsnetze für Fehler außerhalb des
|
||||
UI-Threads — dort kann ein bereits "IsTerminating"-Fehler nicht mehr verhindert werden,
|
||||
wird aber vollständig protokolliert.
|
||||
- [x] **13.2.2** Logging in Datei im App-Datenverzeichnis, mit Rotation —
|
||||
[AppLogger.cs](LehrerApp.Core/Services/AppLogger.cs), tägliche Datei unter
|
||||
`<AppData>/LehrerApp/logs/`, Dateien älter als 14 Tage werden beim Start gelöscht.
|
||||
6 Tests in [AppLoggerTests.cs](LehrerApp.Tests/AppLoggerTests.cs).
|
||||
- [x] **13.2.3** Einheitliche Benachrichtigungen (Toast/Snackbar) für Erfolg und Fehler —
|
||||
[NotificationService.cs](LehrerApp.Desktop/Services/NotificationService.cs), Overlay unten
|
||||
rechts in [MainWindow.axaml](LehrerApp.Desktop/Views/MainWindow.axaml), blendet sich nach
|
||||
3 s (Erfolg) bzw. 6 s (Fehler) automatisch aus. Aktuell an den globalen Exception-Handler
|
||||
angebunden; bestehende Dialoge zeigen Erfolg/Fehler weiterhin über ihre eigenen
|
||||
Statuszeilen (`StatusMessage`/`ValidationMessage`) — eine Umstellung dieser bestehenden
|
||||
Stellen auf Toasts wäre ein eigener, größerer Umbau über viele Dateien hinweg und ist
|
||||
bewusst nicht Teil dieser Aufgabe.
|
||||
- [x] **13.2.4** Validierungsmeldungen einheitlich an den Eingabefeldern statt in Sammel-Labels.
|
||||
Alle Dialoge mit Formularfeldern umgestellt: `AddStudentDialog`, `ContactEditDialog`,
|
||||
`AddGroupDialog`, `StudentGradesDialog` (`GradeEditItem`), `CollectiveGradeDialog`,
|
||||
`ExamDialog`, `AddSessionDialog`, `ParticipationWizardDialog` (Abschnitt-Formular),
|
||||
Einstellungen (Fach anlegen, Notenschlüssel-Vorlage anlegen, Notenschlüssel-Editor).
|
||||
Muster: pro Feld eine `{Feld}Error`-Property, `Save()` leert alle Fehler-Properties am
|
||||
Anfang, sammelt alle Verstöße über eine lokale `valid`-Variable statt beim ersten Fehler
|
||||
zurückzukehren, und bricht erst am Ende mit `if (!valid) return;` ab — so werden mehrere
|
||||
Fehler gleichzeitig angezeigt. Bewusst als Sammel-Meldung belassen, wo die Meldung sich auf
|
||||
eine Kombination mehrerer Felder bezieht statt auf ein einzelnes Feld: `GradingKeyValidation`
|
||||
(Notenschlüssel-Tabelle als Ganzes), `GradingSchemeEditItem.ValidationMessage`
|
||||
(Summe der drei Prozent-Felder muss 100 ergeben), `ReportGradeRow.ValidationMessage`
|
||||
(Override-Wert + Begründung gehören zusammen), `CatalogValidation`
|
||||
(Kompetenzkatalog-Panel: Fachauswahl, Bereichsname und JSON-Import teilen sich einen
|
||||
Status-Bereich), `AddStudentToGroupDialogViewModel.ValidationMessage` (einzige Prüfung
|
||||
"Schüler ausgewählt?", kein Textfeld zum Andocken vorhanden).
|
||||
|
||||
### 13.3 Datensicherheit
|
||||
- [ ] **13.3.1** Automatisches lokales Backup der LiteDB beim Start (rollierend, letzte 10).
|
||||
|
||||
Reference in New Issue
Block a user