我在应用程序中经常使用guard
语句和fatalError()
来确保数据处于一致状态。它们有助于在开发阶段捕获错误。现在,我处于项目的后期,开始考虑如何处理发布版本中的fatalError()
调用。
我不想删除它们,因为它们有助于暴露未知的错误。我也不想只将它们留在产品版本中,因为它们只会中止应用程序,而应用程序不会向用户提供有关出了什么问题的任何有用信息。我要实现的是在屏幕上显示错误消息,然后在用户按“确定”时中止。我认为可能有两种方法可以做到这一点:
1)请勿呼叫fatalError()
。引发错误。让顶级代码处理错误(例如,显示警报)。该方法的问题在于,它需要更改许多功能以使其变为可抛出的,我认为这很不方便。
2)第二种方法是从网上阅读的内容来看,代码可能会创建警报而无需访问屏幕上的当前视图控制器。诀窍是创建一个新窗口。我尚未调查细节。
我担心的是,我认为这两种方法都具有相同的固有局限性,因此并不适用于所有情况。例如,假设UITableViewControler
的数据源委托方法出了问题,它可以在委托方法内显示警报吗?我对此表示怀疑。
因此,我想知道向用户显示致命错误消息的常见做法是什么?感谢您的任何建议。
{
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
}
}