Was ist die beste Vorgehensweise, wenn in einer Desktopanwendung nicht behandelte Ausnahmen auftreten?
Ich wollte dem Benutzer eine Nachricht anzeigen, damit er den Support kontaktieren kann. Ich würde dem Benutzer empfehlen, die Anwendung neu zu starten, aber nicht zu erzwingen. Ähnlich wie hier beschrieben: ux.stackexchange.com - Wie gehe ich am besten mit unerwarteten Anwendungsfehlern um?
Das Projekt ist eine .NET WPF-Anwendung, daher könnte der beschriebene Vorschlag folgendermaßen aussehen (Beachten Sie, dass dies ein vereinfachtes Beispiel ist. Wahrscheinlich ist es sinnvoll, die Ausnahmedetails auszublenden, bis der Benutzer auf "Details anzeigen" klickt und einige Funktionen bereitstellt einfach den Fehler melden):
public partial class App : Application
{
public App()
{
DispatcherUnhandledException += OnDispatcherUnhandledException;
}
private void OnDispatcherUnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e)
{
LogError(e.Exception);
MessageBoxResult result = MessageBox.Show(
$"Please help us fix it and contact support@example.com. Exception details: {e.Exception}" +
"We recommend to restart the application. " +
"Do you want to stop the application now? (Warning: Unsaved data gets lost).",
"Unexpected error occured.", MessageBoxButton.YesNo);
// Setting 'Handled' to 'true' will prevent the application from terminating.
e.Handled = result == MessageBoxResult.No;
}
private void LogError(Exception ex)
{
// Log to a log file...
}
}
In der Implementierung (Commands of ViewModels oder Event-Handler von externen Ereignissen) würde ich dann nur die spezifische exogene Ausnahme abfangen und alle anderen Ausnahmen (ohne Kopf und unbekannte Ausnahmen) bis zum oben beschriebenen "Last-Resort-Handler" sprudeln lassen. Eine Definition von Ausnahmen ohne Kopf und exogenen Ausnahmen finden Sie unter: Eric Lippert - Ärgerliche Ausnahmen
Ist es sinnvoll, den Benutzer entscheiden zu lassen, ob die Anwendung beendet werden soll? Wenn die Anwendung beendet wird, haben Sie mit Sicherheit keinen inkonsistenten Status ... Andererseits kann der Benutzer nicht gespeicherte Daten verlieren oder einen gestarteten externen Prozess nicht mehr stoppen, bis die Anwendung neu gestartet wird.
Oder ist die Entscheidung, ob Sie die Anwendung ausnahmsweise beenden sollten, abhängig von der Art der Anwendung, die Sie schreiben? Ist es nur ein Kompromiss zwischen "Robustheit" und "Korrektheit", wie in Code Complete, Second Edition, beschrieben
Um Ihnen einen gewissen Kontext zu geben, um welche Art von Anwendung es sich handelt: Die Anwendung wird hauptsächlich zur Steuerung chemischer Laborinstrumente und zur Darstellung der Messergebnisse für den Benutzer verwendet. Zu diesem Zweck kommunizieren die WPF-Anwendungen mit einigen Diensten (lokalen und Remote-Diensten). Die WPF-Anwendung kommuniziert nicht direkt mit den Instrumenten.