编辑:问题已经解决(部分):这是一个模拟器错误。我已经在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'
是否达到了捕获量和最终块数。
答案 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");
}
但我现在没有办法自己测试它。
答案 3 :(得分:0)
要处理Iphone / Ipad中的异常处理,您必须放置@try @catch块 有关详细信息,请参阅Exception Handling