iOS做一些简单的异常处理

程序中写了如下代码, 就会立即崩溃


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函数中, 程序猿就可以对发生的异常进行写入本地文件的操作. 等下次用户启动应用,传给后台.

你可能感兴趣的:(iOS做一些简单的异常处理)