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

Iphone 如何在objective-c和xcode中启用异常处理,iphone,objective-c,xcode,gcc,exception-handling,Iphone,Objective C,Xcode,Gcc,Exception Handling,编辑:问题已经解决(部分):这是一个模拟器错误。我已经在iOS 3.1.3和4.0的两台设备上编译并测试了这一点。异常处理正确。小心,模拟器是你的敌人 这让我快发疯了。我不知道如何在我的项目中启用异常处理。查看下面的代码和调试器输出 我的目标是捕获异常,而不是更正代码,以便处理异常并且应用程序不会崩溃 我使用的是XCode 3.2.3,iPhoneSDK4最终版。我刚刚创建了一个简单的基于视图的iPhone应用程序来测试这一点 我已经查看了我的项目设置,是的,选中了“启用目标C异常”开关。我使用

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

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

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

我使用的是XCode 3.2.3,iPhoneSDK4最终版。我刚刚创建了一个简单的基于视图的iPhone应用程序来测试这一点

我已经查看了我的项目设置,是的,选中了“启用目标C异常”开关。我使用的是GCC4.2

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

我错过了什么

提前谢谢 尼克

导致

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'

如果我正确理解您的问题,是否达到了捕获或最终块。

您的Try/catch块工作正常

它正在尝试运行您的代码,并捕获错误。 您需要决定当它捕获到错误时要做什么,并在块中为其编码。 我通常在接球的时候这样做。因为无论是否引发异常,最后一位都将执行。

引用自: “
objc\u exception\u throw
不是一个异常。它是抛出Objective-C异常的函数。类似地,
EXC\u算术
也不是Objective-C异常;它是一个Mach(内核)异常,这意味着你的应用程序试图做一些完全无效的事情。–Peter Hosey 5月14日9:14”

不过,该线程似乎确实有一个指向您的问题解决方案的链接。这个链接看起来有点冒险,但如果它起作用,对你来说可能是值得的

有与此相关的bug报告,例如:(本月早些时候发布)


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

您的示例代码正在捕获
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");
}
不过,我现在没有办法自己测试


有关更多信息,请参阅。

示例代码只是一个简单的场景,用于强制捕获异常。我认为,由于NSArray为空,您不会看到错误,因为总是返回nil。请尝试此操作,NSArray*foo=[NSArray arrayWithObjects:@“yeah”,“yeah1”,nil];而不是NSArray*foo=[[NSArray alloc]init];你弄错了。我想要这个例外。这不是关于处理NSArray的问题。这是关于处理异常的,如果您向无法识别的对象发送消息,会引发异常。是的,在我发布答案后,我意识到您试图强制执行错误,当我第一次运行您的代码时,我没有返回任何错误?。我现在知道了,这意味着我做了一些奇怪的事!。不可否认,我对您的预期感到困惑。感谢我正在研究的帖子。我不明白的是:在这种情况下有一个例外:NSInvalidArgumentException,声明为未捕获,这是NSException的一个实例。因此,似乎存在某种无法捕获的异常。在objective-c这样的动态语言中,向对象实例发送未知消息应该是一种常见的情况,那么如何处理这种异常呢?这是一个很好的观点。您是否查看了
NSSetUncaughtExceptionHandler
?是的,我做了。苹果的文档中说,“设置了顶级的错误处理功能,在程序终止之前,你可以在最后一分钟执行日志记录。”应用程序不应该终止:)谢谢Kalle,它看起来确实像个bug。实际上有点悲哀。这不会编译,因为NSInvalidArgumentException被定义为字符串常量,它不是NSException类或继承自NSException的类。看起来对的引用是准确的。我想这个异常将由NSException处理,但它目前已被窃听。
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");
}