如何避免“因未捕获的异常而终止应用”

时间:2015-12-15 15:10:05

标签: ios objective-c error-handling exception-handling migration

有些时候您遇到异常并导致应用崩溃。就我而言,在这里:

+ (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时保存上下文而终止。我不明白为什么那段代码不能逃避异常。它不应该记录“由于$ error而无法保存主上下文”?

问题是,NSError有什么意义吗?如何逃避异常并崩溃?我应该使用@ try-catch而不是NSError吗?

编辑1

所以,感谢下面的TheEye先生,我明白NSError并没有逃避这个uncaught exception,为了避免崩溃,我最好使用@ try-catch代替。

但是,“最好纠正异常的原因,因为它不应该发生。”所以我认为更新问题应该更好,如下所示:

如何让上下文等到迁移完成并执行保存?在迁移失败的情况下,我将删除所有上下文和持久性存储,因此保存过程(如果迁移失败)应该无效。否则(迁移成功),保存正常。

修改2

所以,为了“纠正异常的原因”,我最终修复了这样的保存上下文:

if (context.hasChanges && context.persistentStoreCoordinator.persistentStores.count) {
...
}

结束了我的问题。谢谢您在这里度过的时光。

1 个答案:

答案 0 :(得分:1)

错误对象仅用于预期的错误 - 如果发生无法预料的事情(例如某些线程问题),则会抛出异常。您可以使用try / catch来捕获它,但最好更正异常的原因,因为它不应该发生。