如何在objective-c和xcode中启用异常处理

时间:2010-06-30 07:59:35

标签: iphone objective-c xcode gcc exception-handling

编辑:问题已经解决(部分):这是一个模拟器错误。我已经在iOS 3.1.3和4.0的两个设备上编译和测试了这个。正确处理了异常。小心,模拟器是你的敌人!

这让我发疯了。我不知道如何在我的项目中启用异常处理。查看下面的代码和调试器输出。

我的目标是捕获异常,而不是更正代码,以便处理异常并且应用程序不会崩溃。

我正在使用XCode 3.2.3,iPhone SDK 4 final。我刚刚创建了一个基于iPhone的简单视图来测试它。

我查看了我的项目设置,然后选中了“启用Objective-C Exceptions”开关。我正在使用GCC 4.2。

当我详细查看构建过程时,编译器标志-fno-objc-exceptions不在参数列表中!

我在这里缺少什么?

提前致谢 尼克

NSArray * foo = [[NSArray alloc] init];

@try {
   NSLog(@"trying...");  
   [foo objectForKey:@"yeah"];
}
@catch (NSException * e) {
   NSLog(@"catching %@ reason %@", [e name], [e reason]);
}
@finally {
   NSLog(@"finally");
}

导致

trying...

-[__NSArrayI objectForKey:]: unrecognized selector sent to instance 0x5d5f780

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSArrayI objectForKey:]: unrecognized selector sent to instance 0x5d5f780'

*** Call stack at first throw:
(
 0   CoreFoundation                      0x02393919 __exceptionPreprocess + 185
 1   libobjc.A.dylib                     0x024e15de objc_exception_throw + 47
 2   CoreFoundation                      0x0239542b -[NSObject(NSObject) doesNotRecognizeSelector:] + 187
 3   CoreFoundation                      0x02305116 ___forwarding___ + 966
 4   CoreFoundation                      0x02304cd2 _CF_forwarding_prep_0 + 50
...
)
terminate called after throwing an instance of 'NSException'

是否达到了捕获量和最终块数。

4 个答案:

答案 0 :(得分:3)

来自How do I catch global exceptions?的引用: “objc_exception_throw不是例外。它是抛出Objective-C异常的函数。同样,EXC_ARITHMETIC不是Objective-C异常;它是Mach(内核)异常,意味着你的app试图做一些完全无效的事情。 - Peter Hosey 5月14日9:14“

该线程确实有一个指向问题解决方案的链接,但它出现了。链接转到http://www.restoroot.com/Blog/2008/10/20/crash-reporter-for-iphone-applications-part-2/,看起来有点风险,但如果它有效,那么对你来说可能是值得的。

有与此相关的错误报告,例如:http://www.openradar.me/8081169(本月早些时候发布)

(更新以总结以下评论中的信息。)

答案 1 :(得分:1)

如果我理解你的问题。

您的Try / catch块工作正常。

它正在尝试运行您的代码,并捕获错误。 您需要决定在块中捕获错误并为其编写代码时要执行的操作。 我通常在CATCH部分那样做。因为无论异常还是没有被抛出,finally位都会执行。

答案 2 :(得分:1)

您的示例代码正在捕获NSException异常,但不会捕获被抛出的异常NSInvalidArgumentException。如果你寻找那个特定的例外,你可能会有更好的运气。

NSArray * foo = [[NSArray alloc] init];

@try {
   NSLog(@"trying...");  
   [foo objectForKey:@"yeah"];
}
@catch (NSInvalidArgumentException *e) {
   NSLog(@"Invalid argument called.");
}
@catch (NSException * e) {
   NSLog(@"catching %@ reason %@", [e name], [e reason]);
}
@finally {
   NSLog(@"finally");
}

但我现在没有办法自己测试它。

有关详细信息,请参阅http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/ObjectiveC/Articles/ocExceptionHandling.html

答案 3 :(得分:0)

要处理Iphone / Ipad中的异常处理,您必须放置@try @catch块 有关详细信息,请参阅Exception Handling