2014-08-28 65 views
0

我使用下面的代碼創建了一個文件:如何使用塊來處理由NS方法返回的錯誤

NSMutableString *tabString = [NSMutableString stringWithCapacity:0]; // it will automatically expand 

// write column headings <----- TODO 

// now write out the data to be exported 
for(int i = 0; i < booksArray.count; i++) { 
    [tabString appendString:[NSString stringWithFormat:@"%@\t,%@\t,%@\t\n", 
          [[booksArray objectAtIndex:i] author], 
          [[booksArray objectAtIndex:i] binding], 
          [[booksArray objectAtIndex:i] bookDescription]]]; 
} 

if (![self checkForDataFile: @"BnN.tab"]) // does the file exist? 
    [[NSFileManager defaultManager] createFileAtPath:documentsPath contents: nil attributes:nil]; // create it if not 

NSFileHandle *handle; 
handle = [NSFileHandle fileHandleForWritingAtPath: [NSString stringWithFormat:@"%@/%@",documentsPath, @"BnN.tab"]]; // <---------- userID? 
[handle truncateFileAtOffset:[handle seekToEndOfFile]]; // tell handle where's the file fo write 
[handle writeData:[tabString dataUsingEncoding:NSUTF8StringEncoding]]; //position handle cursor to the end of file (why??) 

這是我使用的回讀文件(用於調試)的代碼:

// now read it back 
NSString* content = [NSString stringWithContentsOfFile:[NSString stringWithFormat:@"%@/%@",documentsPath, @"BnN.tab"] 
               encoding:NSUTF8StringEncoding 
               error: ^{ NSLog(@"error: %@", (NSError **)error); 
               }]; 

我得到這最後的聲明,說2個生成錯誤:

發送「無效(^)(無效)」,以不兼容的類型NSE的」參數RROR * __ *自動釋放」

使用未聲明的標識符的 '錯誤'

這是第一次我使用一個塊來處理的方法返回的錯誤;我無法在SO或Google中找到任何文檔顯示如何執行此操作。我究竟做錯了什麼?

+5

你爲什麼認爲你可以傳遞一個塊到一個類型爲'NSError **'的參數? – rmaddy 2014-08-28 16:09:15

+0

呃......我在一個例子中看到了......錯,是吧?這是*塊*我遇到問題... SD – SpokaneDude 2014-08-28 16:09:56

回答

1

該功能期望NSError**參數,而不是塊。你應該叫它的方式是這樣的:

NSError *error = nil; 
NSString* content = [NSString stringWithContentsOfFile: [NSString stringWithFormat:@"%@/%@", documentsPath, @"BnN.tab"] 
               encoding: NSUTF8StringEncoding 
               error: &error]; 
if (content == nil) { 
    NSLog("error: %@", error); 
} 
+1

這是*不是*檢查錯誤情況的正確方法。如Apple在「錯誤處理編程指南」中所述,您應該始終檢查*返回值*,在這種情況下,if(content == nil)',並且僅在返回值指示錯誤時評估錯誤變量。 – 2014-08-28 16:40:50

+0

@MartinR好點,固定。我想我最近在node.js世界花了太多時間,並且在我自己之前得到了一點點:) – 2014-08-28 16:42:54

+0

RATS!正如我對rmaddy評論的評論中所提到的那樣,我在搜索Google時看到塊被用作錯誤處理程序......所以我的下一個問題是:如何判斷我是否可以使用塊? – SpokaneDude 2014-08-28 16:45:11

相關問題