Thực hành tốt nhất là gì khi một ngoại lệ chưa được xử lý xảy ra trong ứng dụng máy tính để bàn?
Tôi đã suy nghĩ về việc hiển thị một tin nhắn cho người dùng, để anh ta có thể liên hệ với bộ phận hỗ trợ. Tôi muốn giới thiệu cho người dùng khởi động lại ứng dụng, nhưng không ép buộc. Tương tự như những gì được thảo luận ở đây: ux.stackexchange.com - Cách tốt nhất để xử lý các lỗi ứng dụng không mong muốn là gì?
Dự án là một ứng dụng .NET WPF, vì vậy đề xuất được mô tả có thể giống như thế này (Lưu ý rằng đây là một ví dụ đơn giản. Có lẽ sẽ có ý nghĩa để ẩn các chi tiết ngoại lệ cho đến khi người dùng nhấp vào "Hiển thị chi tiết" và cung cấp một số chức năng cho dễ dàng báo cáo lỗi):
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...
}
}
Trong quá trình triển khai (Lệnh của ViewModels hoặc trình xử lý sự kiện của các sự kiện bên ngoài) sau đó tôi sẽ chỉ bắt ngoại lệ ngoại sinh cụ thể và để tất cả các ngoại lệ khác (ngoại lệ xương và không xác định) nổi lên "Trình xử lý cuối cùng" được mô tả ở trên. Để có định nghĩa về các trường hợp ngoại lệ có xương và ngoại sinh, hãy xem: Eric Lippert - Ngoại lệ làm phiền
Liệu nó có ý nghĩa để cho người dùng quyết định nếu ứng dụng nên được chấm dứt? Khi ứng dụng bị chấm dứt, thì bạn chắc chắn không có trạng thái không nhất quán ... Mặt khác, người dùng có thể mất dữ liệu chưa được lưu hoặc không thể dừng bất kỳ quy trình bên ngoài đã bắt đầu nào nữa cho đến khi ứng dụng được khởi động lại.
Hoặc là quyết định nếu bạn nên chấm dứt ứng dụng trên các ngoại lệ chưa được xử lý tùy thuộc vào loại ứng dụng bạn đang viết? Có phải đó chỉ là sự đánh đổi giữa "sự mạnh mẽ" so với "tính chính xác" như được mô tả trong Code Complete, Second Edition
Để cung cấp cho bạn một số bối cảnh chúng ta đang nói về loại ứng dụng nào: Ứng dụng chủ yếu được sử dụng để kiểm soát các dụng cụ phòng thí nghiệm hóa học và hiển thị kết quả đo cho người dùng. Để làm như vậy, các ứng dụng WPF giao tiếp với một số dịch vụ (dịch vụ địa phương và từ xa). Ứng dụng WPF không giao tiếp trực tiếp với các công cụ.