¿Cuál es la mejor práctica cuando se producen excepciones no controladas en una aplicación de escritorio?
Estaba pensando en mostrar un mensaje al usuario, para que pueda ponerse en contacto con el soporte. Recomendaría al usuario reiniciar la aplicación, pero no forzarla. Similar a lo que se discute aquí: ux.stackexchange.com - ¿Cuál es la mejor manera de manejar errores inesperados de la aplicación?
El proyecto es una aplicación .NET WPF, por lo que la propuesta descrita podría verse así (tenga en cuenta que este es un ejemplo simplificado. Probablemente tendría sentido ocultar los detalles de la excepción hasta que el usuario haga clic en "Mostrar detalles" y proporcione alguna funcionalidad para informar fácilmente el error):
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...
}
}
En la implementación (Comandos de ViewModels o controlador de eventos externos), solo capturaría la excepción exógena específica y dejaría que todas las demás excepciones (excepciones descabelladas y desconocidas) se propaguen al "controlador de último recurso" descrito anteriormente. Para obtener una definición de excepciones exógenas y descabelladas, eche un vistazo a: Eric Lippert - Excepciones irritantes
¿Tiene sentido dejar que el usuario decida si la aplicación debe terminarse? Cuando finaliza la aplicación, seguramente no tiene un estado incoherente ... Por otro lado, el usuario puede perder datos no guardados o ya no puede detener ningún proceso externo iniciado hasta que se reinicie la aplicación.
¿O es la decisión si debe terminar la aplicación en excepciones no manejadas, dependiendo del tipo de aplicación que está escribiendo? ¿Es solo una compensación entre "robustez" versus "corrección" como se describe en Code Complete, Segunda edición
Para darle un poco de contexto de qué tipo de aplicación estamos hablando: la aplicación se utiliza principalmente para controlar instrumentos de laboratorio químico y mostrar los resultados medidos al usuario. Para hacerlo, las aplicaciones WPF se comunican con algunos servicios (servicios locales y remotos). La aplicación WPF no se comunica directamente con los instrumentos.