Клиентское приложение 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?

3
JOM 29 Авг 2011 в 08:21

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];
...
6
justin 29 Авг 2011 в 05:32

Совершенно очевидно, что при отсутствии данных библиотека вызывает исключение (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.
}
0
Can 29 Авг 2011 в 05:07