为什么@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 {
}
我有一个对数字和数组进行运算的敏感方法。有一次我有这样的事情:
@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 {
}