【问题标题】:Exception Handling Help Xcode 4.6异常处理帮助 Xcode 4.6
【发布时间】:2013-05-28 23:39:09
【问题描述】:

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

首先这是我在 main 中的代码:

#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 中的一些设置,但我无法让代码运行并处理错误。我上网查了一下,没找到答案。

任何帮助都会很棒。

【问题讨论】:

  • 没有分号我认为这不会与编译器标志的任何组合一起编译..
  • 这实际上与 xcode 无关。无论您使用何种 IDE,任何 Objective-C 编译器都不会编译它(至少在非 ARC 项目中会发出警告)。

标签: objective-c exception-handling error-handling xcode4.6


【解决方案1】:

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

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

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

试试这个:

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

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

【讨论】:

  • 我仍然很困惑,因为这不是错误处理的重点吗?它看到一个错误,但它并没有像我想要的那样处理它。再说一次,我是菜鸟,我不明白您所说的流量控制是什么意思。我也试过'count'并得到同样的错误......
  • 在 Cocoa/iOS 中,抛出异常然后捕获和恢复是不是你如何进行可恢复的错误处理。这与 Java 完全不同。
  • 我发现如果我关闭自动引用计数,它也会像我想要的那样运行代码.....不知道为什么,有什么想法吗?
  • 是的,非 ARC 编译器允许编译 ARC 编译器视为错误的构造。很可能是因为它们确实应该是错误。
【解决方案2】:

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

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

@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

【讨论】:

    猜你喜欢
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    • 2011-08-26
    • 1970-01-01
    • 1970-01-01
    • 2011-10-28
    • 2013-02-02
    相关资源
    最近更新 更多