2013-08-07 3 views
3

Я пытаюсь получить Captions из данного изображения instagram, однако, если нет заголовка, приложение выдает исключение и сбой. Как бы мне реализовать @try и @catch. Вот то, что я до сих пор:Try-Catch Error Objective C

@try { 
    RNBlurModalView *modal = [[RNBlurModalView alloc] initWithViewController:self title:[NSString stringWithFormat:@"%@",entry[@"user"][@"full_name"]] message:[NSString stringWithFormat:@"%@",text[@"caption"][@"text"]]]; 
    [modal show]; 
} 
@catch (NSException *exception) { 
    NSLog(@"Exception:%@",exception); 
} 
@finally { 
    //Display Alternative 
} 
+0

Вы попробовали [исключение] вместо исключения в своем заявлении NSLog. – asafreedman

+0

Я действительно не знаю, как вы могли мне рассказать? – Prad

+4

Я предполагаю, что вы также выбрасываете исключение? Использование исключений для обычных ситуаций, подобных этому, не рекомендуется в Objective-C. Исключения для ... ну ... исключительных ситуаций, от которых программа не может восстановиться. Вместо этого не следует использовать объект 'NSError' и сигнализировать пользователю, если нет надписи. – borrrden

ответ

5

Это не хорошее использование исключений и try - catch - finally блоки. Вы говорите, что получаете исключение, если заголовок nil. Итак, что именно вы хотите, чтобы ваше приложение делало это, чтобы грамотно справиться с этой ситуацией? Не показывать диалог вообще? Тогда вы могли бы сделать что-то вроде:

NSString *user = entry[@"user"][@"full_name"]; 
NSString *caption = text[@"caption"][@"text"]; 

if (caption != nil && caption != [NSNull null] && user != nil && user != [NSNull null]) { 
    RNBlurModalView *modal = [[RNBlurModalView alloc] initWithViewController:self title:user message:caption]; 
    [modal show]; 
} 

Или, возможно, вы хотите, чтобы показать что-то другое, если таковые nil:

NSString *user = entry[@"user"][@"full_name"]; 
NSString *caption = text[@"caption"][@"text"]; 

if (caption == nil || caption == [NSNull null]) 
    caption = @"";  // or you might have @"(no caption)" ... whatever you want 
if (user == nil || user == [NSNull null]) 
    user = @""; 

RNBlurModalView *modal = [[RNBlurModalView alloc] initWithViewController:self title:user message:caption]; 
[modal show]; 

Или, если у вас есть исходный код для RNBlurModalView, возможно, вы можете определить, почему именно он генерирует исключение, если заголовок nil, и исправить эту проблему.

Существует множество возможных подходов, в зависимости от того, что вы хотите, чтобы приложение выполняло в этой ситуации, но обработка исключений - это, несомненно, не правильный подход. Как Dealing With Errors секция Программирования с помощью Objective-C руководства, исключения предназначены для непредвиденной «ошибки программиста», а не простые логические ошибки, и как они говорят:

Вы не должны использовать примерочные поймать блок вместо стандартных проверок программирования для методов Objective-C.

+0

Это не работает, вот что происходит 'libC++ abi.dylib: terminate called throwing the exception' – Prad

+0

' 2013-08-06 23: 52: 32.878 Floadt [2589: c07] - [NSNull objectForKeyedSubscript:]: непризнанный селектор отправлен к примеру 0x3102678 2013-08-06 23: 52: 32.880 Floadt [2589: c07] *** Завершение приложения из-за неперехваченного исключения «NSInvalidArgumentException», причина: '- [NSNull objectForKeyedSubscript:]: непризнанный селектор, отправленный в экземпляр 0x3102678' libC++ abi.dylib: terminate called throwing exception' – Prad

+0

@ prnk28 Ваша ошибка говорит вам, что объект является '[NSNull null]'. Так что просто добавьте проверки на это. См. Пересмотренный ответ. Я предполагаю, что ошибка возникает из заголовка '[NSNull null]', поэтому это редактирование должно это сделать. Если нет, вы должны точно определить, какой объект получает значение '[NSNull null]'. – Rob

Смежные вопросы