如何处理 NSPersistentContainer.loadPersistentStores 中的错误?

Posted

技术标签:

【中文标题】如何处理 NSPersistentContainer.loadPersistentStores 中的错误?【英文标题】:How to handle errors in NSPersistentContainer.loadPersistentStores? 【发布时间】:2017-08-17 02:20:01 【问题描述】:

我的 AppDelegate 附带以下大家熟悉的 Core Data 模板:

lazy var persistentContainer: NSPersistentContainer = 
    let container = NSPersistentContainer(name: "newsapp")
    container.loadPersistentStores(completionHandler:  (storeDescription, error) in
        if let error = error as NSError? 
            fatalError("Unresolved error \(error), \(error.userInfo)")
        
    )
    return container
()

它还有以下评论:

应用程序的持久容器。这个实现 创建并返回一个容器,为 应用到它。这个属性是可选的,因为有合法的 可能导致商店创建失败的错误条件。

用代码替换此实现以适当地处理错误。 fatalError() 导致应用程序生成崩溃日志并终止。您不应该在运输应用程序中使用此功能,尽管它可能在开发过程中很有用。

此处出现错误的典型原因包括:

父目录不存在、无法创建或不允许写入。 由于设备锁定时的权限或数据保护,永久存储不可访问。 设备空间不足。 无法将商店迁移到当前模型版本。

检查错误消息以确定实际问题是什么。

确实,在这个地方调用它是一个坏主意,不仅在生产应用程序中不允许这样做,而且因为as I read elsewhere,如果数据存储因任何原因损坏,用户将不得不重新安装应用程序不知道那件事。在这种情况下,用户也可以删除并忘记我的应用。

现在,应该如何处理此类错误和其他错误?即使我编写了错误处理代码,如果这些错误几乎从未发生,我如何测试它是否正常工作?

我找遍了,但找不到任何例子。

【问题讨论】:

我认为您应该为它创建一条警报消息,仅此而已。 @Mannopson 警报消息然后呢?再试一次?应用崩溃? 【参考方案1】:

在大多数情况下,fatalError 是唯一对此错误有意义的“处理”,尽管您可能希望显示一个警报,告诉用户首先发生了什么。如果您需要持久存储但无法加载它,那您就完蛋了。

其中一些错误是在开发过程中应该出现的。就像商店迁移或数据保护问题一样——您需要对其进行测试,并在必要时在发布前修复应用程序。对于这样的情况,fatalError 实际上是有意义的,因为只有你会体验到它。

在列出的示例中,唯一可能会意外出现且难以测试的示例是设备空间不足。您可以检查可用空间并提醒用户。但是你仍然没有办法从错误中恢复,除非你的应用程序使用了大量可以清除的空间。如果发生这种情况,ios 将已经警告他们空间不足,因此没有必要自己做。

如果您没有大量数据可以清除,fatalError 在这里仍然有意义。

【讨论】:

我的问题是设备空间不足。在这种情况下我应该继续使用fatalError 吗? 也许吧。与任何错误处理情况一样,您需要回答以下问题:您的应用程序可以做些什么来恢复?如果设备已满,您的应用程序有什么用处吗?如果是这样,请尝试这样做。如果没有,那么没有其他方法可以回应。 感谢您的评论!所以我还没有任何恢复选项。此错误仅在第一次引发,对吗? (第一次启动应用程序时)。如果我可以检查persistentContainer 的状态会更好。如果成功创建,用户必须能够将数据添加到persistentStore。是否可以检查此状态?再次感谢 @Mannopson 每次第一次初始化 Persistent Container 时都会进行此检查(它是一个惰性 var),因此它取决于您设计应用程序时与 CoreData 堆栈相关的方式。如果您坚持使用 XCode 模板设置它的方式,并且您首先访问 App 委托中的核心数据堆栈(例如通过执行获取或从那里在主视图控制器中注入其 viewContext 时),那么您如果设备已满,将收到此错误。无论如何,正如 Tom Harrington 所解释的,系统已经完成了通知用户的工作 永远不要在生产代码中使用 fatalError。如果遇到这会使您的应用程序崩溃。

以上是关于如何处理 NSPersistentContainer.loadPersistentStores 中的错误?的主要内容,如果未能解决你的问题,请参考以下文章

如何处理 UsernameNotFoundException 春季安全

如何处理c#中的错误代码

Akka 如何处理消息版本?

开玩笑测试 - 如何处理 JsonWebToken 响应

如何处理 JSON 响应

“不知道如何处理' nvcc 致命错误