Bir masaüstü uygulamasında işlenmeyen bir istisna olduğunda, en iyi uygulama nedir?
Kullanıcıya bir mesaj göstermeyi düşünüyordum, böylece desteğe başvurabilecekti. Uygulamayı yeniden başlatması için kullanıcıya öneririm, ancak zorlamak değil. Burada tartışılana benzer: ux.stackexchange.com - Beklenmeyen uygulama hatalarını ele almanın en iyi yolu nedir?
Proje bir .NET WPF uygulamasıdır, bu nedenle tarif edilen teklif şöyle görünebilir (Bu basitleştirilmiş bir örnek olduğuna dikkat edin. Muhtemelen kullanıcı "Ayrıntıları Göster" e tıklayıncaya ve bazı işlevsellikler sağlayıncaya kadar istisna ayrıntılarını gizlemek mantıklı olacaktır. hatayı kolayca bildir):
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...
}
}
Uygulamada (ViewModels Komutları veya harici olayların olay işleyicisi) o zaman sadece belirli dışsal istisnayı yakalarım ve diğer tüm istisnaların (boneheaded ve bilinmeyen istisnalar) yukarıda açıklanan "Son başvuru işleyicisi" ne yapmasına izin verirdim. Kemik kafalı ve dışsal istisnalar tanımına bir göz atın: Eric Lippert - Vexing istisnaları
Kullanıcının, uygulamanın sonlandırılıp sonlandırılmayacağına karar vermesine izin vermek mantıklı mı? Uygulama sonlandırıldığında, o zaman kesinlikle tutarsız bir durumunuz olmaz ... Öte yandan, kullanıcı kaydedilmemiş verileri kaybedebilir veya uygulama yeniden başlatılıncaya kadar başlatılan herhangi bir harici işlemi durduramaz.
Yoksa, yazdığınız uygulamanın türüne bağlı olarak, işlenmeyen istisnalar halinde başvuruyu sonlandırmanız gerekip gerekmediği kararı mı? Code Complete, Second Edition'da açıklandığı gibi sadece "sağlamlık" ile "doğruluk" arasında bir takas mı var?
Ne tür bir uygulamadan bahsettiğimize sizlere bir bağlam vermek için: Uygulama, kimyasal laboratuar cihazlarını kontrol etmek ve ölçülen sonuçları kullanıcıya göstermek için kullanılır. Bunu yapmak için WPF uygulamaları bazı servislerle iletişim kurar (yerel ve uzak servisler). WPF uygulaması doğrudan enstrümanlarla iletişim kurmaz.