繁体   English   中英

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

[英]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");
}

不过,我现在没有办法自己测试。

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

要在Iphone / Ipad中处理异常处理,您必须将@try @catch块放入更多详细信息,请参阅异常处理

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM