Qual è la migliore pratica quando si verificano eccezioni non gestite in un'applicazione desktop?
Stavo pensando di mostrare un messaggio all'utente, in modo che potesse contattare l'assistenza. Vorrei raccomandare all'utente di riavviare l'applicazione, ma non forzarlo. Simile a ciò che è discusso qui: ux.stackexchange.com - Qual è il modo migliore per gestire errori imprevisti delle applicazioni?
Il progetto è un'applicazione .NET WPF, quindi la proposta descritta potrebbe apparire così (Notare che questo è un esempio semplificato. Probabilmente avrebbe senso nascondere i dettagli dell'eccezione finché l'utente non fa clic su "Mostra dettagli" e fornisce alcune funzionalità a segnala facilmente l'errore):
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...
}
}
Nell'implementazione (Comandi di ViewModels o gestore di eventi di eventi esterni) catturerei quindi solo l'eccezione esogena specifica e lascerei che tutte le altre eccezioni (eccezioni non comuni) rimandino al "Gestore dell'ultima risorsa" descritto sopra. Per una definizione di eccezioni stordite ed esogene dare un'occhiata a: Eric Lippert - Eccezioni molestanti
Ha senso lasciare che l'utente decida se l'applicazione deve essere chiusa? Quando l'applicazione viene terminata, sicuramente non si ha uno stato incoerente ... D'altra parte l'utente può perdere dati non salvati o non è più in grado di interrompere qualsiasi processo esterno avviato fino al riavvio dell'applicazione.
O è la decisione se è necessario chiudere l'applicazione per eccezioni non gestite a seconda del tipo di applicazione che si sta scrivendo? È solo un compromesso tra "robustezza" e "correttezza" come descritto in Codice completo, Seconda edizione
Per darti un contesto di quale tipo di applicazione stiamo parlando: l'applicazione viene utilizzata principalmente per controllare gli strumenti di laboratorio chimico e mostrare all'utente i risultati misurati. Per fare ciò le applicazioni WPF comunicano con alcuni servizi (servizi locali e remoti). L'applicazione WPF non comunica direttamente con gli strumenti.