【问题标题】:Best practice for presenting App internal error to user?向用户呈现应用程序内部错误的最佳实践?
【发布时间】:2020-03-19 10:07:19
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

    标签: ios uikit fatal-error


    【解决方案1】:
    • 类似于创建窗口,有一种方法可以获取'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,当所有视图都没有数据或发生错误时,您可以使用运行时 swizzle 方法添加占位符图像。如EmptyDataSet
    • 记录错误并将日志保存到本地文件中,必要时将其上传到您的服务器,分析它们并帮助用户解决问题。

    【讨论】:

      猜你喜欢
      • 2013-06-23
      • 2013-06-03
      • 1970-01-01
      • 1970-01-01
      • 2016-05-03
      • 2011-05-19
      • 2015-08-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多