异常处理Exception

1、异常现象
当出现异常的时候,程序会直接闪退;
要想不让程序闪退,可以使用@try{}@catch(NSException *exception){} 方法将可能出错的程序放到try 函数里面;
2、异常函数的使用场景

2.1非主流做法:先报错,在抛出

int main(int argc, char * argv[]) {
    @try{
        @autoreleasepool {
            return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
        }
    }@catch(NSException *exception){
        //将错误写进沙河里面。在重新启动的时候将沙河里面的错误数据传到服务器
        [[exception callStackSymbols] writeToFile:@"" atomically:YES];
        NSLog(@"main========");
    }
   
}

2.2崩溃日志的大概处理方式

//三方平台:友盟,Flurry Crashlytics
// 在这里捕捉异常(程序会先在这里捕捉异常,然后崩溃)
void handleException(NSException *exception){
   
    NSMutableDictionary *dict = [NSMutableDictionary dictionary];
    dict[@"callstack"] = [exception callStackSymbols]; //调用栈信息(错误来源于哪个方法)
    dict[@"name"] = [exception name];//异常名称
    dict[@"reason"] = [exception reason]; //异常描述(报错理由)
    
    //将错误信息写入沙河
    [dict writeToFile:@"" atomically:YES];
    
}

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    //在下次启动的时候将沙河里面的错误传递给服务器
    
    //设置捕捉异常的回调
    NSSetUncaughtExceptionHandler(handleException);
    
    return YES;
}

3.程序的闪退处理

// 在这里捕捉异常(程序会先在这里捕捉异常,然后崩溃)
void handleException(NSException *exception){
    [[UIApplication sharedApplication].delegate performSelector:@selector(handle)];
 
    
}
-(void)handle{
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"title" message:@"" delegate:self cancelButtonTitle:@"cancel" otherButtonTitles:@"other", nil];
    [alert show];
    //重新启动runloop
    [[NSRunLoop currentRunLoop] addPort:[NSPort port] forMode:NSDefaultRunLoopMode];
    [[NSRunLoop currentRunLoop] run];
    
}
-(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex{
    NSLog(@"点击按钮");
    exit(0);
}

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    //在下次启动的时候将沙河里面的错误传递给服务器
    
    //设置捕捉异常的回调(当有崩溃发生时,就会走这里)
    NSSetUncaughtExceptionHandler(handleException);
    
    return YES;
}

4.主动抛异常

下面两种方法只能用一个,不能同时使用
   @throw [[NSException alloc] initWithName:@"name" reason:@"reason" userInfo:nil];
    
    [NSException raise:@"name" format:@"%@:exception",NSStringFromSelector(@selector(begnkuiAction:))];
    

你可能感兴趣的:(异常处理Exception)