[iOS] Handling Parsing Errors

此份文件為個人學習事件驅動XML程式的翻譯,內文請參考蘋果官方文件,若有翻譯錯誤請見諒,請勿挪作商業用途,並著明出處。


當parser在XML文件中遇到語法的錯誤或任何其他的問題使之無法形式完善(well-formed),它會停止解析並且傳送一個訊息到它的委任。如果該委任有實作parser:parseErrorOccurred:方法,那它就會接收這個訊息,在它的實作中,應該要顯示通知使用者是什麼問題的訊息。解析錯誤是致命的(亦即,不可復原的),通知使用者是你唯一可以做的事情(好難翻)。有了這個資訊,使用者就可能可以修好XML,讓文件能成功解析。

Well-formed: 表示遵守文法

表一顯示如何實作parser:parseErrorOccurred:方法。

表一:處理解析錯誤。

- (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError {
    NSWindow *modWin = [self windowForSheet];
    if (!modWin) modWin = [NSApp mainWindow];
    NSAlert *parserAlert = [[NSAlert alloc] init];
    [parserAlert setMessageText:@"Parsing Error!"];
    [parserAlert setInformativeText:[NSString stringWithFormat:@"Error %i,
        Description: %@, Line: %i, Column: %i", [parseError code],
        [[parser parserError] localizedDescription], [parser lineNumber],
        [parser columnNumber]]];
    [parserAlert addButtonWithTitle:@"OK"];
    [parserAlert beginSheetModalForWindow:modWin modalDelegate:self
        didEndSelector:@selector(alertDidEnd:returnCode:contextInfo:)
        contextInfo:nil];
    [parserAlert release];
}
 
- (void)alertDidEnd:(NSAlert *)alert returnCode:(int)returnCode contextInfo:(void *)contextInfo { }



在這範例中的關鍵行是建構NSAlert物件的資訊文本。這份文本包含了錯誤碼(一個NSXMLParserError enum常數)、一個局部化的錯誤描述和獨立在XML文件內錯誤的位置的一列數字與一欄數字(巢狀層級)。在範例中,委任從兩個不同的來源獲得這資訊:從parser物件本身(由該方法的第一個引數)或是由第二個引數提供的NSError物件。從parser物件,它也能得到一個NSError物件,從此物件可以得到一個局域化的描述。


然而,預設的NSError局域化描述是是最根本的(rudimentary),你可能想要提供你自己的局域化描述而不是依靠由NSError物件獲得的描述。有時解析錯誤會希望一個應用導向(application-specific)的解釋。為此目的實作一個函數或方法,你可以使用NSXMLParserError常數定義錯誤來決定在NSLocalizedString macro要使用那個custom鍵。(當然,你也必須創建一個字串(strings)檔並且做任何必要的事情去國際化你的應用程式)



留言