为什么此代码在分布式应用程序中崩溃,但在调试器中工作?

问题描述:

我有简单的代码执行和万一它崩溃我想捕捉异常,所以应用程序不会崩溃。为什么此代码在分布式应用程序中崩溃,但在调试器中工作?

@try { 
    x = [self try_doMyWork:Param]; 
} @catch (NSException* e) { 
    NSLog(@"Exception"); 
} 

虽然这种代码在调试和捕捉异常(这是一个简单的索引超出阵列的端部)崩溃在在​​iPhone分布式应用程序。

这是为什么,我该如何确保它也可以在分布式应用程序上工作?

+0

一些问题无法在尝试捕捉中捕获。你是否100%肯定分布式副本上的错误是一个越界问题? – Jeremy

+3

另外在Objective-C中使用try-catch块通常是不好的做法。只要防止阵列超出范围,你就会做得更好。 –

+0

该代码处理许多字节数组和字符串操作,所以它确实有很多东西我总是需要检查 - 但我想这是在Objective-C中的方法。在Java中,它只是围绕它放置一个简单的catch块。谢谢! – user387184

未捕获的应用程序级异常只是导致崩溃的一个原因。像EXC_BAD_ACCESS这样的BSD信号也会导致崩溃 - 并且捕获NSExceptions不会阻止这些信号。

在不知道try_doMyWork的细节的情况下,不可能说出具体的崩溃:但我认为C层(而不是Objective-C层)崩溃的最常见原因是内存管理问题 - 尝试写或读你的应用程序不应该访问的东西。最可能的解释是,您在调试中看到的异常与您在分发中看到的错误不同。

+0

我想不出总结这个链接的好方法,所以我没有把它放在答案中,但这也是阐明Objective-C异常和C错误之间差异的有用资源:http:// www .cocoawithlove.com/2010/05/handling-unhandled-exceptions-and.html [我不推荐在分布式应用程序中使用signal(...)作为处理这种方式的一种方式 - 如果甚至可能的话] – Arkaaito

+0

非常有趣,而且相当混乱:-) Java中的异常处理是一个简单的概念,而在iPhone中它根本不是! – user387184

在调试模式下,堆管理器可以在缓冲区前后分配对象(称为守卫)并用已知值(如0x7F)填充这些守卫。它这样做是为了当你释放内存时它可以测试这些看守,并且它可以告诉你是否在分配内存的末尾(或开始之前)写入内存。通过这种方式,它可以告诉你,你的代码有一个错误(一个记忆潦草)。

在发布模式下,它不会创建这些警卫,因此当您在分配的内存之外写入时,会发生不良事件(如崩溃)。