Я новичок в разработке для iPhone / Objective-C, я успешно разбираю XML с NSXMLParser
, но не могу получить исключения для правильной работы.Я хотел бы использовать исключения для работы с неожиданным XML.
Я обертываю код для создания NSXMLParser
объекта и отправляю setDelegate и анализирую сообщения для объекта внутри @try
@catch
block, перехватывая @NSException
.
Если я поместил NSAssert(FALSE, @"error)
в блок @try, исключение будет перехвачено правильно.Однако, если у меня произошел сбой NSAssert
внутри вызовов делегата (например, didStartElement
, didEndElement
, foundCharacters
), то программа умирает (в iPhone Simulator еще не пробовал устройство).Трассировка стека отладчика показывает, что утверждение было преобразовано в исключение, но не возвращается в код верхнего уровня, где блок @try
находится вокруг вызова сообщения [parser parse]
.Вместо этого я получаю «Завершение приложения из-за необработанного исключения».
Пожалуйста, дайте мне знать, если это известная проблема или я делаю что-то глупое здесь.
Спасибо - Алекс
Некоторый код, чтобы сделать более конкретным;нет попыток исправить этот код для памяти / выпусков / и т.д.
@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
}