有時您面臨異常並導致應用程序崩潰。在我的情況下,在這裏:如何避免「由於未捕獲的異常而終止應用程序」
+ (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