产品测试和上线后往往会遇到一些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