1

有时您面临异常并导致应用程序崩溃。在我的情况下,在这里:如何避免“由于未捕获的异常而终止应用程序”

+ (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) { 
... 
} 

这总结我的问题。谢谢你在这里待你的时间。

+0

如果在迁移后保存时发生异常,迁移将失败,当您再次尝试时可能会再次失败。如果它是可重现的,重现问题并记录异常,然后在您的问题中发布异常以获得解决它的帮助。 – TheEye

+0

我在迁移过程中保存时发生异常。它说:非法企图保存到从未打开过的文件。 “此NSPersistentStoreCoordinator没有持久存储(模式不匹配或迁移失败),无法执行保存操作。” – Eddie

+1

那么,你有你的理由 - 上下文的持久存储还没有打开。有关堆栈溢出错误的问题有很多,请看看它们(例如https://www.google.com/search?q=This+NSPersistentStoreCoordinator+has+no+persistent+stores+%28schema+mismatch +或+ migration + ie = utf-8&oe = utf-8) – TheEye

回答

1

错误对象仅用于预期的错误 - 如果发生某些不可预见的事情(例如某些线程问题),将抛出异常。你可以用try/catch来捕捉它,但是最好纠正异常的原因,因为它不应该发生。

+0

但是,我的代码中的NSError有没有任何意义?你见过它的工作? – Eddie

+0

当然 - 不记得一个用于保存数据库上下文,但对于我一直得到它们的网络连接;-)。 – TheEye

+0

这就是说,对于很多调用来说,可以忽略确切的错误值(在出于调试目的打印之后),一旦发生这种情况,通常不会有任何事情可以做,除了通知用户问题并稍后再试。 – TheEye

相关问题