Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/44.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 我的Objective-C例外不';t导致我的应用程序终止,但Apple';是的_Iphone_Objective C_Ios_Exception - Fatal编程技术网

Iphone 我的Objective-C例外不';t导致我的应用程序终止,但Apple';是的

Iphone 我的Objective-C例外不';t导致我的应用程序终止,但Apple';是的,iphone,objective-c,ios,exception,Iphone,Objective C,Ios,Exception,在我的iOS(iPhone/cocos2d)项目中,我发现我自己抛出的异常并没有导致应用程序终止(它们只是导致当前函数退出,从而导致奇怪的半冻结行为)。例如,以下代码会导致崩溃: NSArray* testArray = [NSArray arrayWithObjects:@"One", @"Two", @"Three", nil]; [testArray objectAtIndex:400]; 当我运行该代码时,我会在控制台中获得以下内容,正如我所期望的: 2011-06-07 12:55:

在我的iOS(iPhone/cocos2d)项目中,我发现我自己抛出的异常并没有导致应用程序终止(它们只是导致当前函数退出,从而导致奇怪的半冻结行为)。例如,以下代码会导致崩溃:

NSArray* testArray = [NSArray arrayWithObjects:@"One", @"Two", @"Three", nil];
[testArray objectAtIndex:400];
当我运行该代码时,我会在控制台中获得以下内容,正如我所期望的:

2011-06-07 12:55:20.421豪宅iphone[38184:207]***由于以下原因终止应用程序
未捕获异常“NSRangeException”,原因:'***-[NSArray
objectAtIndex::索引400超出边界[0..2]'
但是,如果我试图引发一个异常(例如,来自断言),我会得到半冻结,除非我启用了“停止Objective-C异常”。这对我来说很好,但当我的测试人员报告问题时会导致问题——因为应用程序没有崩溃,他们没有崩溃日志发送给我。下面是一个不起作用的异常示例:

NSException* e = [NSException exceptionWithName:NSInternalInconsistencyException 
        reason:[NSString stringWithFormat:@"%s %@", __PRETTY_FUNCTION__,
        [NSString stringWithFormat:@"Invalid argument"]] userInfo:nil];
[e raise];
在关闭“在Objective-C异常时停止”的情况下,这甚至不会导致向控制台发送消息——而是使用NSAssert向我发送控制台消息,但仍然没有停止。所以,Cocoa类生成的异常似乎运行正常,但源于我的代码的异常却不正常


我已经检查了我的代码和cocos2d,没有发现任何@try块可以防止异常;有人有想法吗?

自定义异常应该与其他异常一样工作,我能够在自己的测试应用程序中验证这一点。一些需要检查的事项:

  • 确保未调用
    NSSetUnhandledExceptionHandler
    ,以捕获所有未处理的异常
  • 尝试在调试器外部运行应用程序。
    • 我在上面测试了您的代码,当引发NSRangeException或自定义NSException且未进行处理时,我的应用程序将按预期终止
  • 尝试在其他位置引发异常以验证它是否正常工作,例如main()

  • 注意:不要使用异常作为控制程序流的一种方式,因为在Objective-C中提出异常非常昂贵。

    自定义异常应与其他异常一样工作,我能够在自己的测试应用程序中验证这一点。一些需要检查的事项:

  • 确保未调用
    NSSetUnhandledExceptionHandler
    ,以捕获所有未处理的异常
  • 尝试在调试器外部运行应用程序。
    • 我在上面测试了您的代码,当引发NSRangeException或自定义NSException且未进行处理时,我的应用程序将按预期终止
  • 尝试在其他位置引发异常以验证它是否正常工作,例如main()

  • 注意:不要使用异常作为控制程序流的一种方式,因为在Objective-C中提出异常会非常昂贵。

    嘿,谢谢你的回复。你知道,我没有想到要在我的ApplicationIDFinishLaunching:方法中尝试这段代码,但它会按预期崩溃应用程序。然而,进一步进入应用程序(这是一个使用Cocos2d库的游戏),同样的异常没有任何作用;我还需要做更多的研究。我还注意到Apple文档中说:“Cocoa应用程序主线程上的异常通常不会上升到未捕获异常处理程序的级别,因为全局应用程序对象捕获了所有此类异常。”很高兴知道,尽管有时它确实有效——我想这就是问题所在“通常”*…它们非常昂贵…”在这种情况下,成本不是一个问题。扔它们真的没那么贵。成本与抛出C++异常是一样的。IMO真正的问题在于ObjC程序的设计/编写并不是为了从异常中恢复。使用异常作为控制流通常会导致许多泄漏和其他类似问题,这些问题与展开时未发生的清理有关。另一个例子:
    @synchronized
    将正确地展开并解锁,但我只是没有看到ObjC开发人员在展开时实际手动清理其他锁定机制。嘿,谢谢你的回复。你知道,我没有想到要在我的ApplicationIDFinishLaunching:方法中尝试这段代码,但它会按预期崩溃应用程序。然而,进一步进入应用程序(这是一个使用Cocos2d库的游戏),同样的异常没有任何作用;我还需要做更多的研究。我还注意到Apple文档中说:“Cocoa应用程序主线程上的异常通常不会上升到未捕获异常处理程序的级别,因为全局应用程序对象捕获了所有此类异常。”很高兴知道,尽管有时它确实有效——我想这就是问题所在“通常”*…它们非常昂贵…”在这种情况下,成本不是一个问题。扔它们真的没那么贵。成本与抛出C++异常是一样的。IMO真正的问题在于ObjC程序的设计/编写并不是为了从异常中恢复。使用异常作为控制流通常会导致许多泄漏和其他类似问题,这些问题与展开时未发生的清理有关。另一个例子:
    @synchronized
    将正确地展开并解锁,但我只是没有看到ObjC开发人员在展开时实际手动清理其他锁定机制。