Je suis nouveau dans le développement iPhone/Objective-C, je suis en train d'analyser XML avec succès avec NSXMLParser
mais je ne peux pas obtenir des exceptions pour fonctionner correctement. J'aimerais utiliser des exceptions pour gérer le XML inattendu.NSAssert dans le délégué NSXMLParser ne pas être pris
Je suis enroulant le code pour créer l'objet NSXMLParser
et l'envoi du setDelegate et analyser les messages à l'objet dans un bloc @try
@catch
, attraper @NSException
.
Si je mets NSAssert(FALSE, @"error)
à l'intérieur du bloc @try, l'exception est interceptée correctement. Si, cependant, j'ai un NSAssert
échouer dans les appels de délégué (par exemple, didStartElement
, didEndElement
, foundCharacters
), puis le programme meurt (dans iPhone Simulator, n'a pas encore essayé de périphérique). La trace de la pile du débogueur montre que l'assertion a été élevée dans une exception, mais elle ne ressort pas dans le code de niveau supérieur où le bloc @try
se trouve autour de l'appel [parser parse]
. Au lieu de cela, je reçois "Termination app en raison d'une exception non interceptée."
S'il vous plaît laissez-moi savoir si c'est un problème connu ou si je fais quelque chose de bête ici.
Merci - Alex
code pour rendre plus concrète; aucune tentative pour rendre ce code correct pour la mémoire/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
}
Passer des exceptions via le code d'infrastructure est toujours une très mauvaise idée. Vous ne devriez pas déclencher d'exceptions dans vos méthodes de délégué. –
Belle fuite de mémoire;) –
Kevin - merci, je vais me méfier de ce modèle; tc - oui, le vrai code est plus prudent, mais j'ai besoin d'apprendre les bons modèles de gestion de la mémoire. – Alex