当桌面应用程序中发生未处理的异常时,最佳实践是什么?
我当时想向用户显示一条消息,以便他可以与支持人员联系。我建议用户重新启动应用程序,但不要强行执行。与此处讨论的内容类似: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的命令或外部事件的事件处理程序),我将仅捕获特定的外部异常,并使所有其他异常(骨头异常和未知异常)冒泡直至上述“最后处理程序”。有关笨拙和外来异常的定义,请查看:Eric Lippert-令人讨厌的异常
让用户决定是否应终止应用程序是否有意义? 当应用程序终止时,您可以确定没有不一致的状态...另一方面,用户可能会丢失未保存的数据,或者无法再停止任何已启动的外部进程,直到应用程序重新启动为止。
还是决定是否根据编写的应用程序类型在未处理的异常上终止应用程序?是否仅在“鲁棒性”与“正确性”之间进行权衡,如“ 代码完成”第二版中所述
为了给您一些上下文,我们正在谈论哪种应用程序:该应用程序主要用于控制化学实验室仪器并将测量结果显示给用户。为此,WPF应用程序与某些服务(本地和远程服务)进行通信。WPF应用程序不直接与仪器通信。