有时您面临异常并导致应用程序崩溃。在我的情况下,在这里:如何避免“由于未捕获的异常而终止应用程序”
+ (void)saveContext:(NSManagedObjectContext *)context
{
if ([context hasChanges]) {
[context performBlockAndWait:^{
NSError *error = nil;
BOOL saved = [context save:&error];
if (!saved) {
// do some real error handling
NSLog(@"Could not save master context due to %@", error);
}
else {
if ([context parentContext]) {
[self saveContext:[context parentContext]];
}
}
}];
}
}
它在迁移Coredata时因保存上下文而终止。我不明白为什么那段代码不能逃避异常。不应该记录“由于$错误而无法保存主环境”?
问题是,NSError有什么含义?如何逃避异常和崩溃?我应该使用@ try-catch而不是NSError吗?
编辑1
所以,感谢TheEye先生下面,我明白NSError不逃避这个uncaught exception
,并避免崩溃,我最好使用@的try-catch来代替。
但是,“这将是更好的纠正异常的原因,因为它不应该发生”,所以我认为这应该是更好的更新如下问题:
我应该怎么做上下文等到迁移完成并执行保存?在迁移失败的情况下,我将删除所有上下文和持久存储,以便保存过程(在迁移失败的情况下)应该无效。否则(迁移成功),正常保存。
编辑2
所以,以“纠正异常的原因”,我结束了固定的保存方面是这样的:
if (context.hasChanges && context.persistentStoreCoordinator.persistentStores.count) {
...
}
这总结我的问题。谢谢你在这里待你的时间。
如果在迁移后保存时发生异常,迁移将失败,当您再次尝试时可能会再次失败。如果它是可重现的,重现问题并记录异常,然后在您的问题中发布异常以获得解决它的帮助。 – TheEye
我在迁移过程中保存时发生异常。它说:非法企图保存到从未打开过的文件。 “此NSPersistentStoreCoordinator没有持久存储(模式不匹配或迁移失败),无法执行保存操作。” – Eddie
那么,你有你的理由 - 上下文的持久存储还没有打开。有关堆栈溢出错误的问题有很多,请看看它们(例如https://www.google.com/search?q=This+NSPersistentStoreCoordinator+has+no+persistent+stores+%28schema+mismatch +或+ migration + ie = utf-8&oe = utf-8) – TheEye