@try @catch @finally
首先我们平时访问数组 越界 或者野指针的时候 很有可能会造成系统的崩溃 app闪退,这么对用户的体验很差。
我们可以用@try方法 来捕获异常 来降低崩溃的频率 提高用户体验、或者通过发送邮件的方式告诉开发者崩溃信息
NSArray *arr = [NSArray array];
//如果感觉访问的数组会出现问题 可以采取 @try
@try {
NSLog(@"11");
//访问越界数组的值
NSString *str = arr[1];
//如果上面的语句发生了异常 那么 44就不会打印
NSLog(@"44");
}@catch(NSException *exception) {
NSLog(@"22");
}
@finally {
NSLog(@"33");
}
//这个处理就不会崩溃 但是 44不会打印
这个代码的执行顺序是 11 -- 22 -- 33
//如果@try里面没有捕获到异常 那么代码的执行顺序是 11 --- 44 -- 33 @catch里面的代码22不会执行
总的来说就是 @try @finally的代码肯定会执行
@catch里面捕获的代码 就可以处理异常 比如写到沙盒 或者发送邮件跟开发者 这么就可以方便开发人员定位到bug
接下来看如何接收和处理系统的崩溃日志
1.首先定义一个拦截系统异常的函数
//拦截异常
void handleException(NSException *exception){
NSMutableDictionary * info = [NSMutableDictionary dictionary];
info[@"callStack"] = [exception callStackSymbols];//调用栈信息(错误来源哪个方法)
info[@"name"] = [exception name];//异常名字
info[@"reason"] = [exception reason];//异常描述
// [info writeToFile:<#(nonnull NSString *)#> atomically:<#(BOOL)#>] 写入沙盒
NSLog(@"%@-----%s",exception, __func__);
}
2.调用系统的方法 拦截捕获异常 去调用自己设置的方法
//设置来接系统的异常
NSSetUncaughtExceptionHandler(handleException);
发现有@try @cathc 嵌套使用的
- (void)tryOne {
@try {
// 1
[self tryTwo];
}
@catch (NSException *exception) {
// 2
NSLog(@"22222");
NSLog(@"%s\n%@", __FUNCTION__, exception);
// @throw exception; // 这里不能再抛异常
}
@finally {
// 3
NSLog(@"我一定会执行");
}
// 4
// 这里一定会执行
NSLog(@"try");
}
- (void)tryTwo
{
@try {
// 5
NSString *str = @"abc";
[str substringFromIndex:111]; // 程序到这里会崩
}
@catch (NSException *exception) {
// 6
@throw exception; // 抛出异常,即由上一级处理
// 7
NSLog(@"%s\n%@", __FUNCTION__, exception);
}
@finally {
// 8
NSLog(@"tryTwo - 我一定会执行");
}
// 9
// 如果抛出异常,那么这段代码则不会执行
NSLog(@"如果这里抛出异常,那么这段代码则不会执行");
}
githubDemo: https://github.com/rjb0514/tryCatchDemo
//如果有错误的 或者更好的理解请联系我
邮箱:rujianbin123@163.com
网友评论