Objective c 异常处理帮助Xcode 4.6
您好,我对编程非常陌生,但我一直在学习Objective C中的一些教程。我在一个异常处理教程中遇到了一个问题,我的代码没有以同样的方式工作 首先,这是我的主要代码: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
#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编译器视为错误的结构。很可能是因为它们确实应该是错误的错误。