2013-06-02 81 views
0

你好,我对编程非常陌生,但我一直在Objective C中学习几个教程。我在异常处理教程中遇到了一个问题,而且我的代码的工作方式也不一样。异常处理帮助Xcode 4.6

这一切

首先是我的主代码:

#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中的一些设置,我需要更改但我无法获取运行和处理错误的代码。我在网上查找并找不到任何答案。

任何帮助将是伟大的。

+0

良好,没有分号,我不认为这会以任意组合方式来编译的编译器标志.. –

+0

这不是真的与xcode相关。 Objective-C编译器永远不会编译这个(至少会在非ARC项目中提出警告),使您可以使用IDE。 –

回答

2

编译器抱怨,因为你正在调用一个方法,它没有看到过任何声明。

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

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

试试这个:

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

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

+0

我仍然困惑,因为不是错误处理的重点?它看到一个错误,但它并不像我想要的那样处理它。再次,我是一个小白,我不明白你的意思是流量控制。我也尝试'计数',并得到相同的错误... – ctapp1

+0

在Cocoa/iOS中,抛出异常然后捕获和恢复是*不*你如何做可恢复的错误处理。这完全不像Java。 – bbum

+0

我想通了,如果我关闭自动引用计数它会运行代码,我也想要它.....不知道为什么,但有什么想法? – ctapp1

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 
+0

感谢这有助于 – ctapp1