@try-Objective-C中的catch块


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 test [93103:207]例外:***-[NSCFString characterAtIndex:]:范围或索引超出范围2010-07-29 16:45:57.678 test [93103:207]终于
mbogh'July

2
您可以替换NSString * test = [NSString stringWithString:@“ ss”]; 使用NSString * test = @“ ss”;
Duyen-Hoa 2014年

Answers:


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,2010年

1

Objective-C不是Java。在Objective-C中,异常被称为。例外!不要将它们用于错误处理。这不是他们的建议。只需在使用characterAtIndex之前检查字符串的长度即可,一切都很好。


通常不建议在Objective-C中使用try-catch,因为它可能会破坏ARC。
缓慢
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.