首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >主要捕获NSException

主要捕获NSException
EN

Stack Overflow用户
提问于 2014-05-12 19:59:00
回答 2查看 2.6K关注 0票数 3

我接手的iOS应用程序有一种不同于我以前看到的处理NSExceptions的方法,并且想知道为什么它现在不能工作。

在main.m文件中,旧的开发人员在其中包含了以下逻辑:

代码语言:javascript
复制
int main(int argc, char *argv[])
{
    @autoreleasepool {
        int retVal = 0;
        @try {
            retVal =  UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
        }
        @catch (NSException *exception) {
            //
            //Logic to save Exception in DataStore
            //
            NSLog(@"Exception - %@",[exception description]);
            exit(EXIT_FAILURE);
        }
        return retVal;
    }
}

当应用程序再次启动时,您将收到一个将异常发送给我们的提示,如果您确认它将发送到我们的服务器。

最近,我为应用程序的iOS 7推出了一个更优化的更新程序,并注意到我不再从崩溃的应用程序中得到任何这些错误报告。

因此,我通过下面的代码进行了测试,我知道这些代码被调用了:

代码语言:javascript
复制
NSArray *array = [NSArray new];

id object = [array objectAtIndex:4];

我收到这封信:

代码语言:javascript
复制
2014-05-12 14:55:57.575 APPNAME[17989:60b] *** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSArrayI objectAtIndex:]: index 4 beyond bounds for empty array'
*** First throw call stack:
(0x18ab0b09c 0x196a89d78 0x18aa0c680 0x10007f498 0x18d9e02c0 0x18da997d0 0x18da996cc 0x18da98ba0
 0x18da98840 0x18da98564 0x18da984e4 0x18d9dad78 0x18d5d70cc 0x18d5d1c94 0x18d5d1b4c 
 0x18d5d13d4 0x18d5d1178 0x18d5caa30 0x18aacb7e0 0x18aac8a68 0x18aac8df4 0x18aa09b38 
 0x19042f830 0x18da480e8 0x100036b98 0x197073aa0)
libc++abi.dylib: terminating with uncaught exception of type NSException

如您所见,异常不是被记录或保存的,而是完全没有记录的。

2个问题:

  1. 这做法不好吗?我不认为它是,但我是一个小。开发人员和不太确定是否有更好的方法来做这个w/o第三方服务?
  2. 您知道iOS 7中有什么变化会影响这个(未触及的)逻辑吗?
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-05-13 10:44:54

根据NSSetUncaughtExceptionHandler,您可以使用异常编程主题函数来处理未处理的异常。试试下面的代码:

代码语言:javascript
复制
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    NSSetUncaughtExceptionHandler(handleUncaughtException);
    @throw [NSException exceptionWithName:NSGenericException
                                   reason:@"Test uncaught exception handling"
                                 userInfo:nil];

    return YES;
}

void handleUncaughtException(NSException *exception)
{
    NSLog(@"Exception - %@",[exception description]);
    exit(EXIT_FAILURE);
}
票数 5
EN

Stack Overflow用户

发布于 2014-05-12 20:50:10

这做法不好吗?我不认为它是,但我是一个小。开发人员和不太确定是否有更好的方法来做这个w/o第三方服务?

是的,这是不好的做法。UIApplicationMain()是一个黑洞;一旦将控制传递给该函数,任何超出main()调用的代码都不可能再次被调用。

它也是一个简单的实现;它记录到stdout的信息少于常规的异常处理机制(这是您正在看到的输出)。它隐藏了对调试有用的信息,可能还会绕过标准的崩溃报告机制。

注意,还有一个全局未处理的异常处理钩子。我不建议使用它,但它确实存在。

您知道iOS 7中有什么变化会影响这个(未触及的)逻辑吗?

不是手边的但我还没看过。尽管如此,UIApplicationMain()仍然是一个黑洞;它通常永远不会返回。

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23617756

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档