2

什么样的错误可以返回给用户-[NSManagedObjectContext executeFetchRequest:error:]-[NSFetchedResultsController performFetch:]应该如何处理?我在文档中找不到有关这些方法可能出现的错误的任何信息。中定义的错误代码CoreData/CoreDataErrors.h似乎都不适用于获取。

现在我对核心数据提取的错误处理NSAssert就像这样:

 NSError *fetchError = nil;
 NSArray *fetchedResults = [context executeFetchRequest: request error: &fetchError];
 NSAssert( fetchedResults, @"Error fetching: %@", fetchError );

虽然测试我从来没有这个断言失败,但这并不意味着这不会失败。优雅地处理这些错误的最佳实践是什么?

4

4 回答 4

1

When executing a fetch request, I populate the expected array with an empty array instead of leaving it nil.

NSError *error;
NSArray *array = [context executeFetchRequest:request error:&error];
if (array == nil)
{
    NSLog(@"Error retrieving array of values %@", error);
    array = [NSArray array];
}

If you ever want to test your error handling, this answer details how to implement an NSPeristentStore that will give you an error every time.

Core Data Unit Testing - Unsure how to trigger error case in executeFetchRequest:error:

于 2013-01-24T20:42:22.433 回答
0

您已经找到CoreDataErrors.h,另请参阅核心数据常量参考

例如,可能发生的错误是SQLite查询错误。我隐约记得看到过这样的事情,当我在谓词中使用一个操作,该操作被翻译成SQLite支持核心数据的版本不支持的东西。

如果在开发过程中被捕获,您将使用NSError纯粹的调试。如果这发生在已发布的应用程序的运行时,一个选项将是优雅地失败,并且如果可能的话,要求用户指定不同的搜索格式。

于 2013-01-24T17:45:40.707 回答
-1

首先是捕获错误,但这完全取决于代码的上下文,即何时要优雅地处理它,或者如果出现问题,何时要断言并停止发生其他任何事情。

还要记住,fetchedResults 不能返回 nil,没有结果(count == 0),这不是错误,但您显然可能想要针对它编写代码。

NSError *fetchError = nil;
NSArray *fetchedResults = [context executeFetchRequest: request error: &fetchError];
if (fetchError) {
  NSLog(@"Error with fetch: %@",error);
  // Assert or do whatever is required ..
}

// Continue as normal ..
于 2013-01-24T15:50:36.367 回答
-1

我总是将这些错误传递给 NSResponder 链,因此:

NSManagedDocument _document;
NSManagedObjectContext _moc;

NSError *error = nil;
NSArray *result = [_managedObjectContext executeFetchRequest:fr error:&error];
if (fetchedResults == nil && error) {
    [_document presentError:error];
    // or, if this isn't a document-based app, you can do
    // [NSApp presentError:error];
    // or, if this method is in an IBAction you can just do
    // [sender presentError:error];
    // and it'll just do the right thing
}

中的默认实现NSManagedDocument可以很好地呈现这些错误,除非您保存文档并获得多个验证错误,在这种情况下您需要编写一些特殊的东西。

如有疑问,NSError请尽快提出,并且如果您发现自己为 NSError 硬编码了很多 retval 检查,那么您的问题可能更多在于您首先发送的错误返回函数。

NSErrors,一般来说,都是由用户自己解决的;NSExceptions是框架用来让开发人员知道他们需要处理什么的。

于 2013-01-24T17:19:42.863 回答