Клиентское приложение iPhone аварийно завершило работу, когда оно получило NULL в качестве аргумента jsonData. Использование сторонней библиотеки JSONKit со следующей строкой кода:
- (id)objectWithData:(NSData *)jsonData error:(NSError **)error
{
if(jsonData == NULL) { [NSException raise:NSInvalidArgumentException format:@"The jsonData argument is NULL."]; }
return([self objectWithUTF8String:(const unsigned char *)[jsonData bytes] length:[jsonData length] error:error]);
}
В документации JSONKit говорится:
Важно: objectWithUTF8String: и mutableObjectWithUTF8String: вызовет исключение NSInvalidArgumentException, если строка имеет значение NULL.
Вопрос: как мне поступить в этой ситуации, чтобы приложение iPhone НЕ аварийно завершило работу? Не ищу теоретический код обработки исключений, но подсказки, как приложения в целом обрабатывают ситуацию jsonData == NULL?
2 ответа
Просто. соблюдать правила библиотеки, например:
if (jsonData == nil) {
assert(0 && "there was an error upstream -- handle the error in your app specific way");
return; // not safe to pass nil as json data -- bail
}
// now we are sure jsonData is safe to pass
NSError * error = nil;
id ret = [json objectWithData:jsonData error:&error];
...
Совершенно очевидно, что при отсутствии данных библиотека вызывает исключение (NSException). Если вы не знакомы с условиями обработки исключений, я предлагаю прочитать об этом в Википедии и затем на Документ Apple, это довольно распространенная тема программирования.
Что касается проблемы, вам необходимо перехватить исключение :
@try
{
// Do whatever you're doing with the JSON library here.
}
@catch (NSException *exception)
{
// Something happend
if ([exception.name isEqualToString:NSInvalidArgumentException])
{
// This must be the jsonData == NULL.
}
}
@finally
{
// Optional, you can clear things here.
}
Похожие вопросы
Новые вопросы
iphone
НЕ ИСПОЛЬЗУЙТЕ этот тег, если вы не обращаетесь конкретно к iPhone и / или iPod touch от Apple. Для вопросов, не зависящих от оборудования, используйте тег [ios]. Больше тегов, которые нужно рассмотреть, это [xcode] (но только если вопрос касается самой IDE), [swift], [target-c] или [cocoa-touch] (но не [cocoa]). Пожалуйста, воздержитесь от вопросов, касающихся iTunes App Store или iTunes Connect. Если вы используете C #, пометьте [mono].