iOS 捕获异常

2017-04-27  本文已影响151人  高高叔叔

产品测试和上线后往往会遇到一些bug,开发者需要定位到异常的代码这个时候就要捕获异常。

可以通过写一个类CrashExceptioinCatcher,在类中定义一个静态方法startCrashExceptionCatch, 方法里调NSSetUncaughtExceptionHandler(&uncaughtExceptionHandler);

绑定void uncaughtExceptionHandler(NSException *exception)方法处理异常信息,在void uncaughtExceptionHandler(NSException *exception)里将异常打印出来,并附带上设备信息提交至服务器,这样在测试时候能够比较有效的收集异常信息。

头文件
#import <Foundation/Foundation.h>
#import <objc/runtime.h>

@interface CatchCrash : NSObject

void uncaughtExceptionHandler(NSException *exception);

@end
实现文件
void uncaughtExceptionHandler(NSException *exception)
{
    // 异常的堆栈信息
    NSArray *stackArray = [exception callStackSymbols];
    // 出现异常的原因
    NSString *reason = [exception reason];
    // 异常名称
    NSString *name = [exception name];
    NSString *exceptionInfo = [NSString stringWithFormat:@"Exception reason:%@\nException name:%@\nException stack:%@",name, reason, stackArray];
    // 异常出处
    NSString * mainCallStackSymbolMsg = [CatchCrash getMainCallStackSymbolMessageWithCallStackSymbols:stackArray];
    
    NSMutableArray *tmpArr = [NSMutableArray arrayWithArray:stackArray];
    [tmpArr insertObject:reason atIndex:0];
    NSString * errorPlace = [NSString stringWithFormat:@"Error Place%@",mainCallStackSymbolMsg];
        NSLog(@"初始化完毕%@",errorPlace);
    
    NSString * file =[NSString stringWithFormat:@"%@/Documents/error.log",NSHomeDirectory()] ;
    //保存到本地  --  当然你可以在下次启动的时候,上传这个log
    [exceptionInfo writeToFile:file atomically:YES encoding:NSUTF8StringEncoding error:nil];
    NSLog(@"打印出来看看____%@",exceptionInfo);
}
使用方法
    //注册消息处理函数的处理方法
    NSSetUncaughtExceptionHandler(&uncaughtExceptionHandler);
    
    ViewController *testVc = [[ViewController alloc] init];
    self.window.rootViewController = testVc;
    
    self.window.backgroundColor = [UIColor whiteColor];
    [self.window makeKeyAndVisible];
DEMO地址

https://github.com/godwar10/CatchCrash

写在最后
大神勿喷,最近才写记录下方便以后查找。希望能和大家一起学习交流进步。如果觉得好请赏点小钱——谢谢。 祝大家代码永无bug

上一篇下一篇

猜你喜欢

热点阅读