iOS测试环境下捕获异常以及处理方式

 iOS测试环境下捕获异常方式
之前一直想要获取到用户的日志分析以及对于测试人员测试出来的偶现性BUG进行收集和分析。所以针对多方面去考虑了几种方式
1.在测试环境下
  在代码层面我们可以使用@try、catch捕获异常:
  以下是最简单的写法
    
@try {
    // 可能会出现崩溃的代码
}
@catch (NSException *exception) {
    // 捕获到的异常exception
}
@finally {
    // 结果处理
}

当然try、catch是可以嵌套使用的,感兴趣的网友可以自己研究一下。
@try、catch最简单的容错。我个人一直觉得在项目中,容错是一个很需要花心思去考虑的问题,因为目前的手机,系统多种多样。我们写的代码总会有大大小小的问题,这些问题再初期的时候收集不到,就需要我们对容错考虑的多一点。在项目后期收集到错误信息后再进行更改。

在测试环境下为了防止测试人员在测试过程中出现偶现性的BUG而我们不能得知的情况,需要我们收集错误日志以及信息
2.发送错误日志到邮箱中

AppDelegate.m

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after application launch.
    NSSetUncaughtExceptionHandler(&UncaughtExceptionHandler);
    return YES;
}
 
void UncaughtExceptionHandler(NSException *exception) {
    /**
     *  获取异常崩溃信息
     */
    NSArray *callStack = [exception callStackSymbols];
    NSString *reason = [exception reason];
    NSString *name = [exception name];
    NSString *content = [NSString stringWithFormat:@"========异常错误报告========\nname:%@\nreason:\n%@\ncallStackSymbols:\n%@",name,reason,[callStack componentsJoinedByString:@"\n"]];
 
    /**
     *  把异常崩溃信息发送至开发者邮件
     */
    NSMutableString *mailUrl = [NSMutableString string];
    [mailUrl appendString:@"mailto:[email protected]"];
    [mailUrl appendString:@"?subject=程序异常崩溃,请配合发送异常报告,谢谢合作!"];
    [mailUrl appendFormat:@"&body=%@", content];
    // 打开地址
    NSString *mailPath = [mailUrl stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:mailPath]];
}

以上只是在测试环境下的一些小功能,当然我们也可以使用Bugly,友盟,Fabric,极光等第三方来采集错误日志信息

收集错误日志的方法很多种,我们也可以收集测试手机当中的错误日志,如:
将自己的iPhone连接到mac上,然后点击下图的位置:

iOS测试环境下捕获异常以及处理方式

接着在按照下图的步骤查看具体的信息

iOS测试环境下捕获异常以及处理方式

在点击View Device Logs后可以看到你的设备中所有的崩溃信息,可以根据时间进行排序,我们找到刚才的崩溃信息,出现了以下界面:

iOS测试环境下捕获异常以及处理方式

崩溃信息大致大致可以分为以上几个部分,下面来详细介绍:


第一部分是闪退进程的相关信息:

Incident Identifier : 是崩溃报告的唯一标识符。

CrashReporter Key: 是与设备标识相对应的唯一键值。虽然它不是真正的设备标识符,但也是一个非常有用的情报:如果你看到100个崩溃日志的CrashReporter Key值都是相同的,或者只有少数几个不同的CrashReport值,说明这不是一个普遍的问题,只发生在一个或少数几个设备上。

Hardware Model :标识设备类型。 如果很多崩溃日志都是来自相同的设备类型,说明应用只在某特定类型的设备上有问题。上面的日志里,崩溃日志产生的设备是iPhone 4s。

Process:对项目的操作权限,上面的是可读可写

Path:崩溃文件的路径

Identifier:项目标识符,就是Bundle Id

Version:版本号

.....等等.......


第二部分

给出了一些基本信息,包括闪退发生的日期Date/Time和时间Launch Time,设备的iOS版本OS Version等


第三部分
Exception Type:异常的类型。
Exception Codes :异常错误码
Termination Reason:闪退的原因,比如常见的数组越界啊,什么的。
Triggered by Thread:出现问题在哪个线程,这个比较重要,首先确定在哪个线程中出了问题,然后再去定位。


第四部分
这部分提供应用中所有线程的回溯日志。 线程调用的一些,堆栈信息,压根看不懂,所有需要进行符号化处理。


当然以上说的除了第三方的之外大部分都只是在我们内部测试的时候使用。毕竟我们不能拿到用户的手机以及让用户给我们发邮件