2011-09-26 196 views
6

我想這是非常明顯的,但我有一個關於加載數據的問題。如果有一個名爲library.dat的文件,它存儲有關應用程序中對象的所有類型的信息。它的設置都很好(根據initWithCoder和encodeWithCoder等方法),但我只是想知道如果library.dat被破壞會發生什麼。我自己破壞了它,然後應用程序就會崩潰。有什麼辦法來防止崩潰?我可以在加載之前測試一個文件嗎?這裏是位,它可能會非常致命:NSKeyedUnarchiver - 如何防止崩潰

-(void)loadLibraryDat { 

    NSLog(@"loadLibraryDat..."); 
    NSString *filePath = [[self documentsDirectory] stringByAppendingPathComponent:@"library.dat"]; 

    // if the app crashes here, there is no way for the user to get the app running- except by deleting and re-installing it... 
    self.libraryDat = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath]; 



} 

我看了一下* NSInvalidUnarchiveOperationException,但不知道我應該怎麼在我的代碼實現這一點。我會很感激任何例子。提前致謝!

回答

13

你可以用@try {} @ catch {} @最後包裝unarchive調用。這在Apple文檔中有描述:http://developer.apple.com/library/mac/#documentation/cocoa/conceptual/ObjectiveC/Chapters/ocExceptionHandling.html

@try { 
    self.libraryDat = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath]; 
} @catch (NSInvalidUnarchiveOperationException *ex) { 
    //do whatever you need to in case of a crash 
} @finally { 
    //this will always get called even if there is an exception 
} 
+3

非常感謝您確認這是處理此問題的官方方式。 –

+1

NSInvalidUnarchiveOperationException是一個字符串,而不是一類Exception。所以我認爲你必須抓住NSException,然後檢查它的名字......? –

4

你試過'try/catch'塊嗎?類似這樣的:

@try { 
    self.libraryDat = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath]; 
} 
@catch (NSException* exception) { 
    NSLog(@"provide some logs here"); 
    // delete corrupted archive 
    // initialize libraryDat from scratch 
} 
+0

Thanks!我對此相當陌生,人們總是警告反對'try/catch'塊。聽起來在這種情況下非常合理,但。我想沒有別的辦法,只能使用塊,對吧? –

+1

我認爲沒有其他簡單的解決方案。不幸。 – igoris

+0

剛剛嘗試過,但xCode告訴我「未知類型名稱'NSInvalidUnarchiveOperationException'」 - 我必須先定義它嗎? –