程序中写了如下代码, 就会立即崩溃
NSArray *arr = @[@"A"];
arr[3];
并会报错
-[__NSArrayI objectAtIndex:]: index 3 beyond bounds [0 .. 0]
崩溃导致用户不能使用App的其他功能, 是最坏的情况, 使用异常的捕捉就可以避免程序的直接崩溃
NSLog(@"111111111");
@try {
NSArray *arr = @[@"A"];
arr[3];
NSLog(@"222222");
}
@catch (NSException *exception) {
NSLog(@"%@",exception);
NSLog(@"3333333");
}
@finally {
NSLog(@"4444444");
}
NSLog(@"555555");
使用捕捉后打印的信息是:
111111111
*** -[__NSArrayI objectAtIndex:]: index 3 beyond bounds [0 .. 0]
3333333
4444444
555555
可以看到, 即使是try发生了崩溃, try块停止执行, 但是其他块还是会执行.
如果要捕捉发生的异常进行保存和上传后台服务器, 那么可以通过
NSException
中的方法惊醒捕捉
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
// 设置捕捉异常的回调
NSSetUncaughtExceptionHandler(handleException);
return YES;
}
/**
* 拦截异常
*
* @param ex 发送的异常会传递到函数中
*/
void handleException(NSException *ex){
NSMutableDictionary* info = [NSMutableDictionary new];
info[@"callStackSymbols"] = [exception callStackSymbols]; // 调用栈信息(错误来源于哪个函数)
info[@"name"] = [exception name]; // 异常的名字
info[@"reason"] = [exception reason]; // 异常的描述(报错理由)
[info writeToFile:@"xxxxxxx" atomically:YES];
}
如上发生的异常就会传入handleException
函数中, 程序猿就可以对发生的异常进行写入本地文件的操作. 等下次用户启动应用,传给后台.