Objective c 异常处理帮助Xcode 4.6

Objective c 异常处理帮助Xcode 4.6,objective-c,exception-handling,error-handling,xcode4.6,Objective C,Exception Handling,Error Handling,Xcode4.6,您好,我对编程非常陌生,但我一直在学习Objective C中的一些教程。我在一个异常处理教程中遇到了一个问题,我的代码没有以同样的方式工作 首先,这是我的主要代码: #import < Foundation/Foundation.h> #import "Numz.h" int main(int argc, const char * argv[]){ @autoreleasepool { Numz *n = [[Numz alloc]init]; @try

您好,我对编程非常陌生,但我一直在学习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.h”
int main(int argc,const char*argv[]{
@自动释放池{
Numz*n=[[Numz alloc]init];
@试一试{

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

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

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

试试这个:

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

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

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

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

@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

如果没有分号,我不认为它将使用任何编译器标志的组合进行编译。这与xcode无关。没有Objective-C编译器会编译它(至少在非ARC项目中会发出警告)您可能会使用的IDE没有任何特色。我仍然感到困惑,因为这不是错误处理的重点吗?它看到了错误,但它也没有像我希望的那样处理它。同样,我是一个noob,我不明白您所说的流控制是什么意思。我也尝试了“count”,但得到了相同的错误…在Cocoa/iOS中,抛出异常以捕获和恢复是非常困难的不是如何进行可恢复错误处理。这与Java完全不同。我发现如果我关闭自动引用计数,它也会像我想要的那样运行代码……不知道为什么,有什么想法吗?是的,非ARC编译器允许编译ARC编译器视为错误的结构。很可能是因为它们确实应该是错误的错误。