@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

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


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.
медленно
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.