2012-03-20 58 views
4

我有一個簡單的方法,它只需要兩個託管對象ID,爲它們提取managedObjects,創建一個關係,然後將它們保存到managedObjectContext中。調試器在覈心數據保存時停止,但沒有錯誤輸出

當我在managedObjectContext上執行保存時,調試器在保存行上停止,並引用nsmanagedObjectContext保存的objc_exception_throw。雖然輸出的nserror對象中沒有輸出,但它提供了有關拋出異常的詳細信息。它也看起來好像這個保存工作正常,這使得這更加令人困惑。

這裏是有問題的方法...

- (void)relateLocationToInvite:(NSManagedObjectID *)locationID :(NSManagedObjectID *)inviteID { 
NSManagedObject *invite = [self.managedObjectContext objectWithID:inviteID]; 
NSManagedObject *locationObj = [self.managedObjectContext objectWithID:locationID]; 
Location *location = (Location *)locationObj; 

[invite setValue:location forKey:@"location"]; 
NSError *error = nil; 
if(![self.managedObjectContext save:&error]){ 
    NSLog(@"Error relating a location to an invite %@",error); 
} 

}

+1

如果確實異常正在從某處扔在覈心數據棧,所述'error'變量:在設備(ARM架構),相同的結果可使用(如果我的記錯我正確地)來實現可能沒有機會獲得設定。錯誤在驗證失敗等情況下返回,但如果遇到內部不一致性錯誤或類似錯誤,則會拋出異常而不寫任何有意義的錯誤對象。 – warrenm 2012-03-20 19:46:18

+0

如果你還沒有一個,你可以設置一個異常斷點,以在創建異常時捕捉異常,而不是等待異常拋出。這可能會給你更大的碰撞預測背景。您也可以在調試控制檯中使用'bt'命令來獲取故障的堆棧跟蹤。這只是一般性的建議,因爲如果沒有更多關於項目的知識,就很難說出可能出現的問題。 – warrenm 2012-03-20 19:50:51

回答

7

如果應用程序的執行​​方法沒有任何問題(即在繼續未拋出任何未捕獲的異常,並沒有報告任何錯誤),這意味着保存操作的實現發生了異常,並決定默默忽略它。

爲什麼發生這種情況尚不清楚:實現依賴於異常來報告內部錯誤(這不是Objective-C異常應該使用的方式,但其他一些語言更多地使用異常)。只要異常在它到達你自己的代碼之前被捕獲,你就不必擔心它。

如果你想知道異常的原因,你可能會打破objc_exception_throw並使用以下調試命令:

po *(id *)($ebp + 8) 

這將顯示在iPhone模擬器給予功能NSException *參數(86建築)。

po $r0 
+0

然後忽略這個安全嗎?順便說一下,它可以通過更新已經從另一個上下文中從持久存儲中刪除的對象來觸發。 – trapper 2017-02-21 01:11:54