Jaka jest najlepsza praktyka, gdy w aplikacji komputerowej występują nieobsługiwane wyjątki?
Myślałem o wyświetleniu użytkownikowi wiadomości, aby mógł skontaktować się z pomocą techniczną. Poleciłbym użytkownikowi ponowne uruchomienie aplikacji, ale nie wymuszanie jej. Podobne do omawianych tutaj: ux.stackexchange.com - Jaki jest najlepszy sposób radzenia sobie z nieoczekiwanymi błędami aplikacji?
Projekt jest aplikacją WPF platformy .NET, więc opisana propozycja może wyglądać następująco (zwróć uwagę, że jest to uproszczony przykład. Prawdopodobnie sensowne byłoby ukrycie szczegółów wyjątku, dopóki użytkownik nie kliknie opcji „Pokaż szczegóły” i zapewni funkcjonalność łatwo zgłosić błąd):
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...
}
}
We wdrożeniu (Komendy ViewModels lub moduł obsługi zdarzeń zewnętrznych) wychwyciłbym tylko konkretny wyjątek egzogeniczny i pozwoliłbym, aby wszystkie inne wyjątki (bez kości i nieznane wyjątki) wygasały aż do opisanego powyżej „modułu ostatniej instancji”. Definicję wyjątków egzogenicznych i egzogennych można znaleźć w: Eric Lippert - wyjątki Vexing
Czy ma sens pozwolić użytkownikowi zdecydować, czy aplikacja powinna zostać zakończona? Gdy aplikacja zostanie zakończona, na pewno nie będziesz mieć niespójnego stanu ... Z drugiej strony użytkownik może utracić niezapisane dane lub nie jest w stanie zatrzymać żadnego rozpoczętego procesu zewnętrznego, dopóki aplikacja nie zostanie ponownie uruchomiona.
A może to decyzja, czy zakończyć aplikację z nieobsługiwanymi wyjątkami w zależności od rodzaju pisanej aplikacji? Czy to tylko kompromis między „solidnością” a „poprawnością”, jak opisano w Code Complete, wydanie drugie
Aby dać ci kontekst, o jakim rodzaju aplikacji mówimy: Aplikacja służy głównie do kontroli laboratoryjnych instrumentów chemicznych i pokazywania użytkownikowi zmierzonych wyników. W tym celu aplikacje WPF komunikują się z niektórymi usługami (usługami lokalnymi i zdalnymi). Aplikacja WPF nie komunikuje się bezpośrednio z instrumentami.