向用户呈现 App 内部错误的最佳实践?

Best practice for presenting App internal error to user?

我在我的应用程序中经常使用 guard 语句和 fatalError() 来确保数据处于一致状态。它们有助于在开发阶段捕获错误。现在我处于项目的后期阶段,开始考虑如何处理发布版本中的那些 fatalError() 调用。

我不想删除它们,因为它们有助于暴露未知的错误。我不想让它们保持产品发布中的原样,因为它们只会中止应用程序,而这不会为用户提供任何有关出现问题的有用信息。我想要实现的是在屏幕上显示一条错误消息,然后在用户按下 "OK" 时中止。我认为可能有两种方法可以做到这一点:

1) 不要调用 fatalError()。而是抛出错误。让顶级代码处理错误(例如,显示警报)。该方法的问题是它需要更改许多功能才能变成可抛出的,我认为这很不方便。

2) 第二种方法是,根据我在网上阅读的内容,代码可以在不访问屏幕上当前视图控制器的情况下创建警报。诀窍是创建一个新的 window。我还没有调查细节。

我担心的是,我认为这两种方法都有相同的固有局限性,并不适用于所有情况。例如,假设 UITableViewControler 的数据源委托方法出现问题,从委托方法中显示警报是否有效?我怀疑。

所以我想知道向用户显示致命错误消息的常见做法是什么?感谢您的任何建议。

  • 类似于创建 window,有一种方法可以获取 'currentViewController',您可以使用它在任何地方显示警报。
{
   let view = UIViewController.current.view  
   Alert.show(on: view, message: errorMsg)
  //or just: Alert.show(error), handle it in Alert class
}

extension UIViewController {
    class func current(base: UIViewController? = UIApplication.shared.keyWindow?.rootViewController) -> UIViewController? {
        if let nav = base as? UINavigationController {
            return current(base: nav.visibleViewController)
        }
        if let tab = base as? UITabBarController {
            return current(base: tab.selectedViewController)
        }
        if let presented = base?.presentedViewController {
            return current(base: presented)
        }
        return base
    }
}
  • 对于UITableView/UIScrollView/UICollectionView,当没有数据或所有视图都发生错误时,您可以使用运行时调配方法添加占位符图像。比如EmptyDataSet
  • 重新记录错误并将日志保存到本地文件中,必要时将其上传到您的服务器,分析它们并帮助用户解决问题。