从 NSError 获取部分错误

Posted

技术标签:

【中文标题】从 NSError 获取部分错误【英文标题】:Get partial errors from NSError 【发布时间】:2014-08-11 06:36:53 【问题描述】:

使用CloudKit时,有时返回的错误是PartialFailure,这可能是重复订阅等导致的,见下例。

<CKError 0x7f8318711520: "Partial Failure" (2/1011); 
"Failed to modify some subscriptions"; uuid = A434B010-7650-4BBA-8A7A-33CD0690FD15; 
container ID = "iCloud.xxx.xxx"; partial errors:  
EFC65F4A-A595-44A3-A022-323D9CE9B535 = <CKError 0x7f831a007be0: "Server Rejected Request" (15/2032); server message = "subscription is duplicate of '_930081460_AA87A676-DE57-4530-8BB8-7465BF4F4303'"> 
C4913907-28F3-42DB-8455-9966D9084834 = <CKError 0x7f83185cfc20: "Server Rejected Request" (15/2032); server message = "subscription is duplicate of '_930081460_F92FA91D-3E92-4E46-AE59-E912F8871026'"> >

我希望从主要错误对象中检索这些部分错误,但我不知道如何。 NSError 没有 partialError 属性,并且在 userInfo 中也没有 a key 来检索它。

【问题讨论】:

如果您的问题可能适用于 Swift 或 Objective C,那么很可能它不应该被标记。 【参考方案1】:

您不会直接返回NSError,而是返回CKError。查看CKError 的文档,实际上有一个CKPartialErrorsByItemIDKey 键。如果您问我,这看起来像是返回由项目 ID 键入的 CKErrors 字典的键! userInfo 对象应包含该键。

这里也有记录

CloudKit Framework Constants Reference

【讨论】:

其实CKError并不是一个,而只是CloudKit的一个子框架,它包含了所有相关的NSError添加。 你有#import 吗?我看到自动完成,Xcode 6 beta 4。 好点。错误域是 CKErrorDomain 值,但它只是一个 NSError 类型,很公平。 CKError 是一个 Swift 结构,它是 Swift 独有的。 @Jonny 不确定您从哪里获得这些信息,但 CloudKit 框架可在 Swift 或 Objective-C 上完全兼容。【参考方案2】:

两年后,我仍然认为如何访问部分错误没有特别好的文档记录。感谢@Acey 通过CKPartialErrorsByItemIDKey 让我走上正确的道路

对于那些正在苦苦挣扎的人,这里有一个示例,说明我如何最终访问 CKModifySubscriptionsOperation (Swift 2.2) 中的部分错误:

someZoneSubscriptionOperation.modifySubscriptionsCompletionBlock = (savedSubscriptions: [CKSubscription]?, deletedSubscriptionIDs:[String]?, operationError:NSError?) in

    // check specifically for an error in changing subscriptions to custom zone with specific subscriptionID
    if let partialError = operationError?.userInfo[CKPartialErrorsByItemIDKey]?[subscriptionID] as? ErrorType 
        print(partialError)         // prints partial error for custom zone with `subscriptionID` if it exists
    

【讨论】:

以上是关于从 NSError 获取部分错误的主要内容,如果未能解决你的问题,请参考以下文章

如何始终从 NSError 获取英文字符串?

Java 异常和目标 C NSError

如何从 NSError 代码中找到错误描述?

如何处理 iPhone 应用程序中的 NSError? [复制]

重用同一个 NSError 对象会有问题吗?

从 NSError 解析自定义值