Apa praktik terbaik ketika pengecualian yang tidak ditangani terjadi di aplikasi desktop?
Saya sedang berpikir untuk menunjukkan pesan kepada pengguna, sehingga ia dapat menghubungi dukungan. Saya akan merekomendasikan kepada pengguna untuk me-restart aplikasi, tetapi tidak memaksanya. Mirip dengan apa yang dibahas di sini: ux.stackexchange.com - Apa cara terbaik untuk menangani kesalahan aplikasi yang tidak terduga?
Proyek ini adalah aplikasi .NET WPF, sehingga proposal yang dideskripsikan dapat terlihat seperti ini (Perhatikan bahwa ini adalah contoh yang disederhanakan. Mungkin akan masuk akal untuk menyembunyikan detail pengecualian sampai pengguna mengklik "Tampilkan Detail" dan menyediakan beberapa fungsionalitas untuk mudah melaporkan kesalahan):
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...
}
}
Dalam implementasinya (Perintah ViewModels atau event handler dari peristiwa eksternal) saya kemudian hanya akan menangkap pengecualian eksogen spesifik dan membiarkan semua pengecualian lain (pengecualian berkepala dan tidak dikenal) melambung hingga "Handler resor terakhir" yang dijelaskan di atas. Untuk definisi pengecualian yang dikepalai dan eksogen, lihat: Eric Lippert - pengecualian Vexing
Apakah masuk akal untuk membiarkan pengguna memutuskan apakah aplikasi harus dihentikan? Ketika aplikasi dihentikan, maka Anda pasti tidak memiliki keadaan tidak konsisten ... Di sisi lain pengguna dapat kehilangan data yang belum disimpan atau tidak dapat menghentikan proses eksternal yang dimulai lagi sampai aplikasi dimulai ulang.
Atau keputusan apakah Anda harus menghentikan aplikasi pada pengecualian tidak tertangani tergantung pada jenis aplikasi yang Anda tulis? Apakah itu hanya pertukaran antara "ketahanan" vs "kebenaran" seperti yang dijelaskan dalam Kode Lengkap, Edisi Kedua
Untuk memberi Anda beberapa konteks jenis aplikasi yang sedang kita bicarakan: Aplikasi ini terutama digunakan untuk mengontrol instrumen laboratorium kimia dan menunjukkan hasil yang diukur kepada pengguna. Untuk melakukannya, aplikasi WPF berkomunikasi dengan beberapa layanan (layanan lokal dan jarak jauh). Aplikasi WPF tidak berkomunikasi langsung dengan instrumen.