为什么@try 不起作用

Why is @try not working

我有一个对数字和数组进行运算的敏感方法。有一次我有这样的事情:

@try {

CGFloat value = [myArray[index] floatValue];

...

@catch (NSException *exception) {
   [self doSomething];
}

@finally {
}

如果index是负值或者超出myArray范围的值,我想抛出异常,或者换句话说,我想@catch到运行,但是它不起作用,当这种情况发生时,应用程序只会崩溃。

是的,我知道我可以用 if 测试整个事情,但我试图避免使用 if(不要问我为什么)。

为什么以及如何解决?

好吧,我尝试了以下并成功地打印出了 "exception!"。

NSInteger i = -1;
NSArray *array = @[];
@try {
    CGFloat value = [array[i] floatValue];
}
@catch (NSException *e) {
    NSLog(@"exception!");
}

你所做的事情显然有问题(你没有提出问题)。

它崩溃是因为有问题的数组没有对索引进行范围检查。只有某些类型的 'managed' 数组会检查索引。例如,NSArray 将抛出 NSRangeException。像 int myarr[5] 这样的常规 C 数组不会。

当您访问内置数组范围之外的元素时,

Objective-C 不会引发异常;它仍然是未定义的行为 - 即它在 "plain" C.

中的方式

使用 NSArray 代替 "plain C" 数组将解决问题:

NSArray *myArray = @[@1, @3, @20];
@try {

CGFloat value = [myArray[index] floatValue];

...

@catch (NSException *exception) {
   [self doSomething];
}

@finally {
}