Яка найкраща практика, коли в настільному додатку трапляються незроблені винятки?
Я думав про те, щоб показати повідомлення користувачеві, щоб він міг зв’язатися зі службою підтримки. Я б рекомендував користувачеві перезапустити додаток, але не змушувати його. Подібно до того, що тут обговорюється: 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 не спілкується безпосередньо з інструментами.