为什么@try不起作用

时间:2015-05-07 20:08:13

标签: ios objective-c try-catch

我有一个敏感的方法,用数字和数组进行操作。有一次我有这样的事情:

@try {

CGFloat value = [myArray[index] floatValue];

...

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

@finally {
}

如果index是负值或myArray范围之外的值,我想要抛出异常,或者换句话说,我希望@catch运行,但它不起作用,应用程序只是在这样的条件下崩溃发生。

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

为什么以及如何解决这个问题?

3 个答案:

答案 0 :(得分:2)

它崩溃了,因为有问题的数组没有范围检查索引。只有某些类型的“托管”数组会检查索引。例如,NSArray将抛出NSRangeException。常规的C数组如int myarr [5]不会。

答案 1 :(得分:1)

当您访问内置数组范围之外的元素时,Objective-C不会引发异常;它仍然是未定义的行为 - 即它在“普通”C中的方式。

使用NSArray代替“普通C”数组将解决问题:

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

CGFloat value = [myArray[index] floatValue];

...

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

@finally {
}

答案 2 :(得分:0)

好吧,我尝试了以下内容并成功获得了“例外!”打印出来。

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

你正在做的事情显然有些不对(你没有提出你的问题)。