向用户展示应用内部错误的最佳做法?

问题描述 投票:0回答:1

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

我不想删除它们,因为它们有助于暴露未知的错误。我也不想只将它们留在产品版本中,因为它们只会中止应用程序,而应用程序不会向用户提供有关出了什么问题的任何有用信息。我要实现的是在屏幕上显示错误消息,然后在用户按“确定”时中止。我认为可能有两种方法可以做到这一点:

1)请勿呼叫fatalError()。引发错误。让顶级代码处理错误(例如,显示警报)。该方法的问题在于,它需要更改许多功能以使其变为可抛出的,我认为这很不方便。

2)第二种方法是从网上阅读的内容来看,代码可能会创建警报而无需访问屏幕上的当前视图控制器。诀窍是创建一个新窗口。我尚未调查细节。

我担心的是,我认为这两种方法都具有相同的固有局限性,因此并不适用于所有情况。例如,假设UITableViewControler的数据源委托方法出了问题,它可以在委托方法内显示警报吗?我对此表示怀疑。

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

ios uikit fatal-error
1个回答
0
投票
  • 类似于创建窗口,有一种获取“ 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
© www.soinside.com 2019 - 2024. All rights reserved.