@try - блок вылова в Objective-C

193

Почему @try не блокирует работу? Приложение рухнуло, но предполагалось, что оно попадет в блок @try.

 NSString* test = [NSString stringWithString:@"ss"];

 @try {
    [test characterAtIndex:6];

 }
 @catch (NSException * e) {
    NSLog(@"Exception: %@", e);
 }
 @finally {
    NSLog(@"finally");
 }
Александру Цирк
источник
Вы уверены, что это не что-то еще, потому что точный код, который вы вставили выше, работает нормально. 2010-07-29 16: 45: 57.677 тест [93103: 207] Исключение: *** - [NSCFString characterAtIndex:]: диапазон или индекс вне границ 2010-07-29 16: 45: 57.678 тест [93103: 207] наконец
Mbogh
2
Вы можете заменить NSString * test = [NSString stringWithString: @ "ss"]; с NSString * test = @ "ss";
Duyen-Hoa

Ответы:

136

Все работают отлично :)

 NSString *test = @"test";
 unichar a;
 int index = 5;
    
 @try {
    a = [test characterAtIndex:index];
 }
 @catch (NSException *exception) {
    NSLog(@"%@", exception.reason);
    NSLog(@"Char at index %d cannot be found", index);
    NSLog(@"Max index is: %lu", [test length] - 1);
 }
 @finally {
    NSLog(@"Finally condition");
 }

Журнал:

[__NSCFConstantString characterAtIndex:]: диапазон или индекс вне границ

Символ с индексом 5 не найден

Максимальный индекс: 3

Наконец условие

iTux
источник
8
Правильно, но немного вводит в заблуждение - помните, что блок @finally выполняется в ОБА случаях, т.е. независимо от того, было ли исключение или не было выброшено.
Elendurwen
Да, я скучаю по этому :)
iTux
Пожалуйста, исправьте, как отметил @Elendurwen.
Саныч
78

Теперь я нашел проблему.

Удаление obj_exception_throwиз моих точек останова решило это. Теперь он перехватывается @tryблоком, а также NSSetUncaughtExceptionHandlerбудет обрабатывать его, если @tryблок отсутствует.

Александру Цирк
источник
10
Если вы нажмете «продолжить», когда отладчик выйдет из строя, вы должны увидеть, как исключение генерируется и перехватывается вашим обработчиком.
JeremyP
1

Objective-C - это не Java. В Objective-C исключения называются так, как они называются. Исключения! Не используйте их для обработки ошибок. Это не их предложение. Просто проверьте длину строки перед использованием characterAtIndex, и все в порядке ....

Клаус Боннхофф
источник
Использование try-catch в Objective-C, как правило, не рекомендуется, поскольку это может привести к путанице в ARC.
медленно