在运行程序的时候,我们会经常遇到一些异常代码,或者使工程崩溃的原因,为了更好的用户体验进行版本迭代,我们需要将这些问题收集起来。从而快速定位问题。
1.异常处理
通常我们在自定义一些方法的时候,关于传参我们或许考虑的不全面,导致一些异常情况,例如,当我们封装一个方法,穿的参数是方法名,可是方法名在工程中为定义,当进行这种操作的时候,会让用户体验十分不好,因为用户进行了操作,却没有相应的程序反应进行呼应,这时,我么可以通过代码,在相应的地方抛出异常。
if (signature == nil) {
// @throw [NSException exceptionWithName:@"牛逼的错误" reason:@"方法找不到" userInfo:nil];
[NSException raise:@"牛逼的错误" format:@"%@方法找不到", NSStringFromSelector(selector)];
}
2.崩溃分析
崩溃导致的必然结果就是程序在手机上闪退,为了使程序不会闪退,我们可以定位到代码崩溃处加上以下代码即可。
@try {
//崩溃代码
}
@catch (NSException *exception) {
NSLog(@"-----代码有异常----%@", exception );
}
@finally {
NSLog(@"---------33333-");
}
用户在使用应用的期间,或许会碰到一些致使程序闪退的情况,而我们需要将这些情况收集起来,目前通常都会采用第三方平台进行统计分析,例如
- 列表友盟
- Flurry
- Crashlytics
而我们也可以利用苹果自身的sdk NSException进行收集
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
// 将沙盒中的错误信息传递给服务器
// 设置捕捉异常的回调
NSSetUncaughtExceptionHandler(handleException);
return YES;
}
/**
* 拦截异常
*/
void handleException2(NSException *exception)
{
NSMutableDictionary *info = [NSMutableDictionary dictionary];
info[@"callStack"] = [exception callStackSymbols]; // 调用栈信息(错误来源于哪个方法)
info[@"name"] = [exception name]; // 异常名字
info[@"reason"] = [exception reason]; // 异常描述(报错理由)
// [info writeToFile:<#(NSString *)#> atomically:<#(BOOL)#>];
}