Что лучше всего делать, когда в настольном приложении возникают необработанные исключения?
Я думал о том, чтобы показать сообщение пользователю, чтобы он мог связаться со службой поддержки. Я бы порекомендовал пользователю перезапустить приложение, но не заставлять его. Подобно тому, что обсуждается здесь: ux.stackexchange.com - Как лучше всего обрабатывать неожиданные ошибки приложения?
Проект представляет собой приложение .NET WPF, поэтому описанное предложение может выглядеть следующим образом (обратите внимание, что это упрощенный пример. Возможно, имеет смысл скрывать подробности исключения до тех пор, пока пользователь не нажмет «Показать подробности» и не предоставит некоторую функциональность легко сообщить об ошибке):
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...
}
}
В реализации (Команды ViewModels или обработчик событий внешних событий) я бы тогда только поймал конкретное экзогенное исключение и позволил всем остальным исключениям (с головой и неизвестным исключениям) перейти к «Обработчику последней инстанции», описанному выше. Для определения исключений с головой и экзогенными исключениями взгляните на: Эрик Липперт - Исключительные исключения
Имеет ли смысл позволить пользователю решать, следует ли закрыть приложение? Когда приложение завершается, у вас наверняка нет противоречивого состояния ... С другой стороны, пользователь может потерять несохраненные данные или не сможет больше остановить любой запущенный внешний процесс, пока приложение не будет перезапущено.
Или это решение, если вам следует закрыть приложение на необработанные исключения в зависимости от типа приложения, которое вы пишете? Это просто компромисс между «надежностью» и «правильностью», как описано в Code Complete, Second Edition
Чтобы дать вам некоторое представление о том, о каком приложении мы говорим: Приложение в основном используется для управления химическими лабораторными приборами и отображения результатов измерений пользователю. Для этого приложения WPF взаимодействуют с некоторыми службами (локальными и удаленными службами). Приложение WPF не связывается напрямую с инструментами.