Qual é a melhor prática quando ocorre uma exceção não tratada em um aplicativo de desktop?
Eu estava pensando em mostrar uma mensagem ao usuário, para que ele possa entrar em contato com o suporte. Eu recomendaria ao usuário reiniciar o aplicativo, mas não forçá-lo. Semelhante ao discutido aqui: ux.stackexchange.com - Qual é a melhor maneira de lidar com erros inesperados de aplicativos?
O projeto é um aplicativo .NET WPF, portanto, a proposta descrita pode ter a seguinte aparência (Observe que este é um exemplo simplificado. Provavelmente faria sentido ocultar os detalhes da exceção até o usuário clicar em "Mostrar Detalhes" e fornecer algumas funcionalidades para reporte facilmente o erro):
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...
}
}
Na implementação (Comandos do ViewModels ou manipulador de eventos de eventos externos), eu capturava apenas a exceção exógena específica e deixava todas as outras exceções (exceções de cabeça para osso e desconhecidas) chegarem ao "manipulador de último recurso" descrito acima. Para uma definição de exceções exageradas e exageradas, dê uma olhada em: Eric Lippert - Vexing exceptions
Faz sentido deixar o usuário decidir se o aplicativo deve ser encerrado? Quando o aplicativo é encerrado, você certamente não possui um estado inconsistente ... Por outro lado, o usuário pode perder dados não salvos ou não pode mais parar nenhum processo externo iniciado até que o aplicativo seja reiniciado.
Ou é a decisão de encerrar o aplicativo em exceções não tratadas, dependendo do tipo de aplicativo que você está gravando? É apenas uma troca entre "robustez" vs. "correção", como descrito em Code Complete, Second Edition
Para contextualizar qual tipo de aplicação estamos falando: A aplicação é usada principalmente para controlar instrumentos químicos de laboratório e mostrar os resultados medidos ao usuário. Para isso, os aplicativos WPF se comunicam com alguns serviços (serviços locais e remotos). O aplicativo WPF não se comunica diretamente com os instrumentos.