【发布时间】:2014-02-07 10:44:41
【问题描述】:
我的一个 iOS 应用使用 Core Data 和 iCloud 有一段时间了。虽然这在大多数情况下都可以正常工作,但也存在问题和崩溃。问题:我无法通过捕获异常来解决这些崩溃,因为我不知道在哪里执行此操作。
导致应用程序崩溃的异常的最新示例是:
2014-02-07 10:23:45.118 MyApp[1410:3707] -[PFUbiquitySwitchboardEntryMetadata setUseLocalStorage:](754): CoreData: Ubiquity: mobile~5508B01E-F77F-4AF1-88DE-2E2F8DC55932:MyAppCloudDB
Using local storage: 1
2014-02-07 10:23:45.892 MyApp[1410:3707] -[PFUbiquitySwitchboardEntryMetadata setUseLocalStorage:](754): CoreData: Ubiquity: mobile~5508B01E-F77F-4AF1-88DE-2E2F8DC55932:MyAppCloudDB
Using local storage: 0
2014-02-07 10:24:28.632 MyApp[1410:1803] -[_PFUbiquityRecordImportOperation main](731): CoreData: Ubiquity: Error importing transaction log: <PFUbiquityTransactionLog: 0x16177920>
transactionLogLocation: <PFUbiquityLocation: 0x160c3e80>: /var/mobile/Library/Mobile Documents/M889WYL2LY~com~example~MyApp/MyAppTransactionLogs/User~37B9682D-CED2-5F79-AF06-1FE99E7DEE9E/MyAppCloudDB/SZPp~RKudtVxEBMJzTVTupTv0WjG6i~o9Vj54dlknjc=/8AB09D17-5856-49B9-BE4C-A56451FB1EF4.1.cdt
transactionNumber: 34
, exception: *** setObjectForKey: key cannot be nil
User Info: (null)
2014-02-07 10:24:28.661 MyApp[1410:1803] -[_PFUbiquityRecordsImporter operation:failedWithError:](1003): CoreData: Ubiquity: Import operation encountered an error: Error Domain=NSCocoaErrorDomain Code=134060 "The operation couldn’t be completed. (Cocoa error 134060.)" UserInfo=0x162a8b20 {exception=*** setObjectForKey: key cannot be nil}
userInfo: {
exception = "*** setObjectForKey: key cannot be nil";
}. While trying to import the log file at the URL: <PFUbiquityTransactionLog: 0x16177920>
transactionLogLocation: <PFUbiquityLocation: 0x160c3e80>: /var/mobile/Library/Mobile Documents/M889WYL2LY~com~example~MyApp/MyAppTransactionLogs/User~37B9682D-CED2-5F79-AF06-1FE99E7DEE9E/MyAppCloudDB/SZPp~RKudtVxEBMJzTVTupTv0WjG6i~o9Vj54dlknjc=/8AB09D17-5856-49B9-BE4C-A56451FB1EF4.1.cdt
transactionNumber: 34
2014-02-07 10:24:28.686 MyApp[1410:1803] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** setObjectForKey: key cannot be nil'
*** First throw call stack:
(0x30b47e83 0x3aea46c7 0x30a82ecb 0x309dd0cb 0x3099f061 0x309a1841 0x31476aa5 0x3151a96d 0x3b38de7b 0x3b38af93 0x3b38e745 0x3b38e9c5 0x3b4b8dff 0x3b4b8cc4)
libc++abi.dylib: terminating with uncaught exception of type NSException
事务日志似乎有问题。当然,我想解决问题并保持应用程序运行,而不仅仅是让它崩溃。因此,我必须能够捕获并处理异常。但是我该怎么做呢?
我什至不知道这个异常是从哪里来的。我假设它是由 UIManagedDocument 或 UIManagedObjectContext 类抛出的,但我不确定。
即使我知道异常来自这些类之一,我仍然不知道如何捕获它。某些 iCloud 相关类在导入事务日志时在后台线程中引发异常。我的代码中只有对 UIManagedDocument 实例的引用。当然,我可以将对该实例的每个调用包装在一个 Try-Catch 块中,但是当我使用/调用此实例时不会抛出异常,而是当对象自己执行某些工作时。
甚至有可能捕获这样的异常吗?
即使无法捕获并解决异常,如果知道异常已被抛出,那也很棒。这至少让我有机会在下次启动应用程序时处理该问题(向用户显示消息、断开与 iCloud 的连接等)。
那么,处理这些异常的最佳方法是什么?
非常感谢!
【问题讨论】:
标签: ios objective-c exception icloud