iPhone/Objective-C 개발을 처음 사용하여 NSXMLParser
을 사용하여 XML을 성공적으로 파싱했으나 예외가 올바르게 작동하지 않습니다. 예기치 않은 XML을 처리하기 위해 예외를 사용하고 싶습니다.NSXMLParser 대리인의 NSAssert가 캐치되지 않았습니다.
은 내가 NSXMLParser
객체를 생성하고 setDelegate를 보내고 구문 분석 메시지를 객체에 @try
@catch
블록 내부 @NSException
을 잡기위한 코드를 포장하고있다.
NSAssert(FALSE, @"error)
을 @try 블록에 넣으면 예외가 제대로 캐치됩니다. 그러나 NSAssert
이 대표 호출 (예 : didStartElement
, didEndElement
, foundCharacters
)에서 실패한 경우 프로그램이 종료됩니다 (iPhone 시뮬레이터에서 아직 장치를 시도하지 않은 경우). 디버거 스택 추적은 어설 션이 예외로 발생했음을 나타내지 만 @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
}
프레임 워크 코드를 통해 예외를 전달하는 것은 항상 나쁜 생각입니다. 대리자 메서드에서 예외를 발생시키지 않아야합니다. –
좋은 메모리 누출;) –
Kevin - 고마워요, 그 패턴을 조심하겠습니다. tc - 예, 실제 코드는 좀 더주의해야하지만 적절한 메모리 관리 패턴을 배워야합니다. – Alex