Ich bin neu in iPhone/Objective-C-Entwicklung, ich bin erfolgreich Parsing XML mit NSXMLParser
, aber ich kann nicht Ausnahmen erhalten, um ordnungsgemäß zu funktionieren. Ich möchte Ausnahmen verwenden, um mit unerwartetem XML umzugehen.NSAsssert in NSXMLParser Delegat nicht gefangen
Ich Umwickeln Sie den Code für das NSXMLParser
Objekt erstellt und in einem @try
@catch
Block die setDelegate und analysieren Nachrichten an das Objekt zu senden, fangen @NSException
.
Wenn ich NSAssert(FALSE, @"error)
in den @try Block setzen, wird die Ausnahme richtig gefangen. Wenn ich jedoch einen NSAssert
Fehler innerhalb der Delegiertenanrufe (z. B. didStartElement
, didEndElement
, foundCharacters
) habe, dann stirbt das Programm (im iPhone Simulator, Gerät noch nicht ausprobiert). Die Debugger-Stack-Ablaufverfolgung zeigt, dass die Assertion in eine Ausnahme ausgelöst wurde, aber nicht in den Code der obersten Ebene zurückversetzt wird, in dem sich der @try
-Block um den [parser parse]
-Nachrichtenaufruf befindet. Stattdessen bekomme ich "Beenden der App aufgrund einer nicht abgefangenen Ausnahme".
Bitte lassen Sie mich wissen, wenn dies ein bekanntes Problem ist oder wenn ich hier etwas Dummes mache.
Danke - Alex
Einige Code konkreter zu machen; Kein Versuch, diesen Code für Speicher/Releases/etc.
@implementation XMLTester
+(void)runXMLTester
{
BOOL success = FALSE;
XMLTester *tester = [[XMLTester alloc] init];
NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://api.wunderground.com/auto/wui/geo/WXCurrentObXML/index.xml?query=KSFO"]];
NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];
[parser setDelegate:tester];
@try {
//NSAssert(FALSE, @"error"); // this assertion works fine
success = [parser parse];
}
@catch (NSException * e) {
success = FALSE;
NSLog(@"Exception caught %@: %@", [e name], [e reason]);
}
@finally {
NSLog(@"runXMLTester @finally block hit");
}
}
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName attributes:(NSDictionary *)attributeDict
{
NSLog(@"Starting element %@", elementName);
NSAssert(FALSE, @"error"); // this assertion does not work - does not hit @try block around parse message
}
Das Übergeben von Ausnahmen durch Framework-Code ist immer eine wirklich schlechte Idee. Sie sollten in Ihren Delegatmethoden keine Ausnahmen auslösen. –
Schöne Speicherleck;) –
Kevin - danke, ich werde vorsichtig sein, dieses Muster; tc - Ja, der echte Code ist vorsichtiger, aber ich muss richtige Speicherverwaltungsmuster lernen. – Alex