首页 > 代码库 > iOS 捕获系统外异常

iOS 捕获系统外异常

iOS 捕获系统外异常

太阳火神的美丽人生 (http://blog.csdn.net/opengl_es)

本文遵循“署名-非商业用途-保持一致”创作公用协议

转载请保留此句:太阳火神的美丽人生 -  本博客专注于 敏捷开发及移动和物联设备研究:iOS、Android、Html5、Arduino、pcDuino否则,出自本博客的文章拒绝转载或再转载,谢谢合作。


有时应用崩溃,而日志中的输出信息太少,无法定位问题,这是最头疼的事情,尤其很累的时侯,已经想不起来刚才改过什么了,这就叫做无耐。

工欲善其事,必先利其器,下面的方法可以给多些信息,让你看到堆栈执行顺序,在哪里崩溃的,也就能大概给个思路,确定问题的症结。

在 AppDelegate.m 类实现之前加入:

void UncaughtExceptionHandler(NSException *exception) {
    
    // 获取异常相关信息
    NSArray *callStackSymbols = [exception callStackSymbols];
    NSString *callStackSymbolStr = [callStackSymbols componentsJoinedByString:@"\n"];
    NSString *reason = [exception reason];
    NSString *name = [exception name];
    
    // 获取系统当前时间
    NSDate * date = [NSDate date];
    NSDateFormatter * dateFormatter = [[NSDateFormatter alloc] init ];
    [dateFormatter setDateFormat:@"yyyy年MM月dd日 HH小时mm分ss秒"];
    NSString * dateStr = [dateFormatter stringFromDate:date];
    
    NSLog(@"系统当前时间为:%@ \n",dateStr);
    NSLog(@"异常名称:%@ \n",name);
    NSLog(@"异常原因:%@ \n",reason);
    NSLog(@"堆栈标志:%@ \n",callStackSymbolStr);
}


在 AppDelegate.m 类实现的应用启动方法中加入如下语句,为系统设置异常回调函数为上面的声明,详细说明见 “iOS Foundation 框架概述文档:常量、数据类型、框架、函数、发布声明
@implementation AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    
    NSSetUncaughtExceptionHandler(&UncaughtExceptionHandler);