Как включить обработку исключений в target-c и xcode - PullRequest
3 голосов
/ 30 июня 2010

РЕДАКТИРОВАТЬ: Проблема была решена (частично): это ошибка симулятора. Я скомпилировал и протестировал это на двух устройствах с iOS 3.1.3 и 4.0. Исключение было обработано правильно. Будьте осторожны, симулятор - ваш враг!

это сводит меня с ума. Я не знаю, как включить обработку исключений в моем проекте. Посмотрите на вывод кода и отладчика ниже.

Моя цель - перехватить исключение, а не исправлять код, чтобы исключение было обработано и приложение не зависало.

Я использую XCode 3.2.3, iPhone SDK 4, финал. Я только что создал приложение для iPhone на основе простого представления, чтобы проверить это.

Я посмотрел в настройках своего проекта и да, переключатель «Включить исключения Objective-C» отмечен. Я использую GCC 4.2.

Когда я подробно рассмотрю процесс сборки, флаг -fno-objc-exceptions компилятора отсутствует в списке аргументов!

Что мне здесь не хватает?

Спасибо заранее Ник

NSArray * foo = [[NSArray alloc] init];

@try {
   NSLog(@"trying...");  
   [foo objectForKey:@"yeah"];
}
@catch (NSException * e) {
   NSLog(@"catching %@ reason %@", [e name], [e reason]);
}
@finally {
   NSLog(@"finally");
}

ведет к

trying...

-[__NSArrayI objectForKey:]: unrecognized selector sent to instance 0x5d5f780

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSArrayI objectForKey:]: unrecognized selector sent to instance 0x5d5f780'

*** Call stack at first throw:
(
 0   CoreFoundation                      0x02393919 __exceptionPreprocess + 185
 1   libobjc.A.dylib                     0x024e15de objc_exception_throw + 47
 2   CoreFoundation                      0x0239542b -[NSObject(NSObject) doesNotRecognizeSelector:] + 187
 3   CoreFoundation                      0x02305116 ___forwarding___ + 966
 4   CoreFoundation                      0x02304cd2 _CF_forwarding_prep_0 + 50
...
)
terminate called after throwing an instance of 'NSException'

Достигнут ли когда-либо улов, ни последний блок.

Ответы [ 4 ]

3 голосов
/ 30 июня 2010

Цитата из Как отловить глобальные исключения? : «objc_exception_throw не является исключением. Это функция, которая генерирует исключения Objective-C. Точно так же EXC_ARITHMETIC не является исключением Objective-C; это исключение Mach (ядра), означающее, что ваше приложение пыталось что-то сделать полностью недействительный. - Питер Хоси 14 мая в 9:14 "

Тем не менее, в этой теме есть ссылка на решение вашей проблемы. Ссылка идет на http://www.restoroot.com/Blog/2008/10/20/crash-reporter-for-iphone-applications-part-2/, что выглядит немного рискованно, но если это сработает, это может стоить того.

С этим связаны сообщения об ошибках, например: http://www.openradar.me/8081169 (опубликовано ранее в этом месяце)

(Обновлено, чтобы обобщить информацию из комментариев ниже.)

1 голос
/ 30 июня 2010

Ваш пример кода перехватывает исключение NSException, но не выбрасываемое, NSInvalidArgumentException.Возможно, вам повезет больше, если вы ищете это конкретное исключение.

NSArray * foo = [[NSArray alloc] init];

@try {
   NSLog(@"trying...");  
   [foo objectForKey:@"yeah"];
}
@catch (NSInvalidArgumentException *e) {
   NSLog(@"Invalid argument called.");
}
@catch (NSException * e) {
   NSLog(@"catching %@ reason %@", [e name], [e reason]);
}
@finally {
   NSLog(@"finally");
}

У меня сейчас нет возможности проверить его сам.

См. http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/ObjectiveC/Articles/ocExceptionHandling.html для получения дополнительной информации.

1 голос
/ 30 июня 2010

Если я правильно понимаю вашу проблему.

Ваш блок Try / catch работает правильно.

Он пытается запустить ваш код и ловит ошибку. Вам нужно решить, что делать, когда он ловит ошибку, и код для нее в блоке. Я обычно делаю это в части CATCH. В качестве бита finally будет выполняться независимо от исключения или не выбрасывается.

0 голосов
/ 22 августа 2012

Для обработки исключений в Iphone / Ipad вы должны поместить блок @try @catch для более подробной информации, см. Обработка исключений

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...