@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 символAtIndex:]: Діапазон або індекс поза межами 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:]: Діапазон або індекс поза межами

Char в індексі 5 неможливо знайти

Макс індекс: 3

Нарешті умова


8
Правильно, але трохи вводячи в оману - пам’ятайте, що блок @finally виконується у випадках BOTH, тобто незалежно від того, виняток був чи не кинутий.
Elendurwen

Так, я сумую за цим :)
iTux

Виправте, як зауважив @Elendurwen
Саніч

78

Тепер я знайшов проблему.

Видалення obj_exception_throwз моїх точок перерви вирішило це. Тепер це схоплене на @tryблок, а також, NSSetUncaughtExceptionHandlerбуде впоратися з цим, якщо @tryблок відсутній.


10
Якщо ви натиснете кнопку "Продовжувати", коли налагоджувач перерветься, ви побачите, що ваш обробник викидає і потрапляє.
JeremyP

1

Objective-C - це не Java. У винятку Objective-C є те, що вони називаються. Винятки! Не використовуйте їх для обробки помилок. Це не їхня пропозиція. Просто перевірте довжину рядка, перш ніж використовувати символAtIndex, і все в порядку ....


Використання пробного лову в Objective-C, як правило, не рекомендується, оскільки це може потенційно зіпсувати ARC.
повільно
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.