[英]How to enable exception handling in objective-c and xcode
编辑:问题已经解决(部分):这是一个模拟器错误。 我已经在iOS 3.1.3和4.0的两个设备上编译和测试了这个。 正确处理了异常。 小心,模拟器是你的敌人!
这真让我抓狂。 我不知道如何在我的项目中启用异常处理。 查看下面的代码和调试器输出。
我的目标是捕获异常,而不是更正代码,以便处理异常并且应用程序不会崩溃。
我正在使用XCode 3.2.3,iPhone SDK 4 final。 我刚刚创建了一个基于简单视图的iPhone App来测试它。
我查看了我的项目设置,然后选中了“启用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'
是否达到了捕获量和最终块数。
引用如何捕获全局异常? :“ 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 (本月早些时候发布)
(更新以总结以下评论中的信息。)
如果我理解你的问题吧。
您的Try / catch块工作正常。
它试图运行您的代码,并捕获错误。 您需要决定在块中捕获错误并为其编写代码时要执行的操作。 我通常在CATCH部分那样做。 因为最终位将执行而不管异常或不被抛出。
您的示例代码捕获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");
}
不过,我现在没有办法自己测试。
要在Iphone / Ipad中处理异常处理,您必须将@try @catch块放入更多详细信息,请参阅异常处理
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.