在这种情况下如何确定是不是发生错误(Objective-C)

Posted

技术标签:

【中文标题】在这种情况下如何确定是不是发生错误(Objective-C)【英文标题】:How to Determine if Error Occured in this Case (Objective-C)在这种情况下如何确定是否发生错误(Objective-C) 【发布时间】:2011-03-25 04:42:09 【问题描述】:

大家好,我有这个功能:

//retrieves checksum within core data store, returns 0 if a checksum has not been stored
-(double)getStoredChecksum 
    NSError *error;
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription 
                                   entityForName:@"DataFeedManager" inManagedObjectContext:[self managedObjectContext]];
    [fetchRequest setEntity:entity];
    NSArray *fetchedObjects = [[self managedObjectContext] executeFetchRequest:fetchRequest error:&error];
    //+for (NSManagedObject* item in fetchedObjects) //REMOVE
        //+[[self managedObjectContext] deleteObject:item]; //REMOVE FOR CLEARING CHECKSUM CONTENTS

    if ([fetchedObjects count] == 0) //array is empty
        NSLog(@"FETCHED OBJECTS IS EMPTY");
        checksumStored = NO;
        return 0;
    
    if (fetchedObjects == nil) 
        NSLog(@"Error while fetching\n%@",
              ([error localizedDescription] != nil) ? [error localizedDescription] : @"Unknown Error");
    
    if ([fetchedObjects count] > 1)
        NSLog(@"====BAD:Multiple Checksums Retrieved!!!!====");
    checksumStored = YES;
    double returnable = [[[fetchedObjects objectAtIndex:0] valueForKey:@"lastUpdateCheckSum"] doubleValue];
    return returnable;
//getStoredChecksum()

如您所见,它执行了一个获取请求,但是我不确定如何检查是否发生了错误。如您所见,我正在通过[fetchedObjects count] == 0 检查数组是否为空,但是,我在某处听说如果发生错误并且数组为 nil,则计数也会返回 0,因此可以安全地测试那样数组为空,但它掩盖了我对空数组的检查。因此问题是我没有确定的方法来检查是否发生了错误。关于我应该如何去做这件事有什么想法吗?

提前致谢!

编辑:

在这种情况下我将如何检查错误?

NSUInteger numEntities = [[self managedObjectContext] countForFetchRequest:fetchRequest error:&error];

由于 NSUInteger 被指定为无符号整数,所以我什至不能给它赋值 -1 并在以后检查是否有 -1 如果我想的话。

【问题讨论】:

【参考方案1】:

在调用executeFetchRequest:: 之前将error 设置为nil。如果error 之后不是nil,则它被设置,因此发生错误。

count 检查掩盖nil 检查的原因是因为发送到nil 的任何消息都返回nil,在这种情况下也是0。这可以通过首先检查nil 轻松解决,或修改您的if 语句,使其如下:

if (fetchedObjects && [fetchedObjects count] == 0)

对于countForFetchRequest::NSNotFound的情况,发生错误时返回,所以检查一下。

【讨论】:

那么如果数组为nil,即为空,error会被设置成什么? nil 不等于空。空数组表示未获取任何对象。 nil 被返回意味着发生了错误。见developer.apple.com/library/ios/#documentation/Cocoa/Reference/… 好的,谢谢!如果我没有遇到另一个让我感到困惑的案例,我会接受这个作为答案(请参阅上面的编辑部分)。 如果可行,请接受答案,不要在原件上附加另一个问题,而是创建一个新问题!这不是论坛! 我宁愿在一个线程中问类似的问题,使所有内容井井有条,易于查找,尤其是对于有相同问题的其他人。【参考方案2】:

countForFetchRequest:error: 的文档中复制并粘贴

返回值

如果给定的 fetch 请求被传递给 executeFetchRequest:error: 或 NSNotFound 如果发生错误,则该请求将返回的对象数。

所以,

if (numEntities == NSNotFound) 
    // Handle the error

【讨论】:

哇,好的,这在我的文档副本中没有提到:“返回值如果已将给定的获取请求传递给 executeFetchRequest:error: 将返回的对象数。”感谢您的帮助! 是的 - 你是对的。 Xcode 3.2 文档没有提到 NSNotFound。带有 Xcode 4 和在线版本的都可以。

以上是关于在这种情况下如何确定是不是发生错误(Objective-C)的主要内容,如果未能解决你的问题,请参考以下文章

windows10下载软件用户名无效

使用 HttpClient.GetAsync() 时如何确定 404 响应状态

如果执行嵌套的异步调用,则函数运行两次,否则运行一次。需要帮助来预先确定何时会发生这种情况

如何在 C++Builder 发布模式下找到异常,但不是调试

1000+ 个项目的10大JavaScript错误

检测浏览器自动填充