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

相關問題