0

您好,我对编程很陌生,但我一直在学习 Objective C 中的一些教程。我刚刚在异常处理教程中遇到了一个问题,好吧,我的代码并没有以同样的方式工作。

首先这是我的主要代码:

#import  < Foundation/Foundation.h> 
#import "Numz.h"

int main(int argc, const char * argv[]){

@autoreleasepool {

    Numz *n = [[Numz alloc]init];
    @try {
        [n thisisgoingtogetanerror] <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< error on this line      
        }

    @catch (NSException *e) {
            NSLog(@"you got an error in your program");
        }
        NSLog(@"this is code aftr the error");
   }

   return 0;
}

上面的错误说

“Numz”没有可见的@interface 声明选择器“thisisgoingtogetanerror”

我的接口和实现已创建,但内部没有创建变量或方法,但这不是我需要首先处理错误的原因吗?
此外,我也无法获得任何类型的控制台视图,构建只是失败并指出该错误。

可能需要更改 xcode 4.6 中的一些设置,但我无法让代码运行并处理错误。我在网上查过,找不到任何答案。

任何帮助都会很棒。

4

2 回答 2

2

编译器正在抱怨,因为您正在调用一个它从未见过声明的方法。

将其更改为(假设Numz不是该方法的子类,NSArray也不是实现该count方法)[n count];:。

请注意,您永远不应该使用异常来进行流控制。也就是说,您不应该@throw出现异常然后使用@catch来处理异常并继续执行。iOS/Cocoa 中的异常仅用于指示不可恢复的错误。

试试这个:

@interface NSObject(Badness)
- (void)methodBadness;
@end

然后在您的代码中调用该方法。编译器不应该警告,运行时应该@throw。

于 2013-06-02T19:31:36.400 回答
0

异常处理用于运行时的错误/异常。但是你得到的错误发生在编译时

您可以通过以下方式导致运行时错误:

@interface RuntimeError : NSObject
+ (void)cause;
@end

@implementation RuntimeError
+ (void)cause {
    NSAssert(NO, @"This is a runtime error caused through a assertion failure")
}
@end

// Call it with
//     [RuntimeError cause]
// inside the @try-Block
于 2013-06-03T15:26:09.240 回答