首先我们看下NSException
NSException是什么?
最熟悉的陌生人,这是我对NSException的概述,为什么这么说呢?其实很多开发者接触到NSException的频率非常频繁,但很多人都不知道什么是NSException,不知道如何使用NSException。下面从一张截图开始讲起NSException。
直接上代码!
//
// MyUncaughtExceptionHandler.h
// RuiYang
//
// Created by Mac on 2018/7/20.
// Copyright © 2018年 xiangxx. All rights reserved.
//
#import <Foundation/Foundation.h>
// 崩溃日志
@interface MyUncaughtExceptionHandler : NSObject
+ (void)setDefaultHandler;
+ (NSUncaughtExceptionHandler *)getHandler;
+ (void)TakeException:(NSException *) exception;
@end
//
// MyUncaughtExceptionHandler.m
// RuiYang
//
// Created by Mac on 2018/7/20.
// Copyright © 2018年 xiangxx. All rights reserved.
//
#import "MyUncaughtExceptionHandler.h"
// 返回沙盒地址
NSString * applicationDocumentsDirectory()
{
return [NSSearchPathForDirectoriesInDomains (NSCachesDirectory , NSUserDomainMask , YES ) firstObject];
}
// 出现崩溃时的回调函数
void UncaughtExceptionHandler(NSException * exception)
{
NSArray * arr = [exception callStackSymbols];
// 崩溃的原因 可以有崩溃的原因(数组越界,字典nil,调用未知方法...) 崩溃的控制器以及方法
NSString * reason = [exception reason];
NSString * name = [exception name];
NSString * url = [NSString stringWithFormat:@"========异常错误报告========\nname:%@\nreason:\n%@\ncallStackSymbols:\n%@",name,reason,[arr componentsJoinedByString:@"\n"]];
NSString * path = [applicationDocumentsDirectory() stringByAppendingPathComponent:@"ExceptionLog.txt"];
// 将txt文件写入沙盒
[url writeToFile:path atomically:YES encoding:NSUTF8StringEncoding error:nil];
}
@implementation MyUncaughtExceptionHandler
+ (void)setDefaultHandler
{
NSSetUncaughtExceptionHandler(&UncaughtExceptionHandler);
}
+ (NSUncaughtExceptionHandler *)getHandler
{
return NSGetUncaughtExceptionHandler();
}
+ (void)TakeException:(NSException *)exception
{
NSArray * arr = [exception callStackSymbols];
NSString * reason = [exception reason];
NSString * name = [exception name];
NSString * url = [NSString stringWithFormat:@"========异常错误报告========\nname:%@\nreason:\n%@\ncallStackSymbols:\n%@",name,reason,[arr componentsJoinedByString:@"\n"]];
NSString * path = [applicationDocumentsDirectory() stringByAppendingPathComponent:@"ExceptionLog.txt"];
[url writeToFile:path atomically:YES encoding:NSUTF8StringEncoding error:nil];
}
@end
#import <Foundation/Foundation.h>
@interface StatisRequestErrorData : NSObject
+ (void)showXcodeInfo;
@end
#import "StatisRequestErrorData.h"
#import "MyUncaughtExceptionHandler.h"
@implementation StatisRequestErrorData
#pragma mark -- 崩溃日志
+ (void)showXcodeInfo{
[MyUncaughtExceptionHandler setDefaultHandler];
// 发送崩溃日志
NSString *path = [NSSearchPathForDirectoriesInDomains (NSCachesDirectory , NSUserDomainMask , YES ) firstObject];
NSString *dataPath = [path stringByAppendingPathComponent:@"ExceptionLog.txt"];
NSData *data = [NSData dataWithContentsOfFile:dataPath];
if (data != nil) {
[StatisRequestErrorData sendExceptionLogWithData:data];
}else{
NSLog(@"没有崩溃日志");
}
}
#pragma mark -- 发送崩溃日志
+ (void)sendExceptionLogWithData:(NSData *)data
{
NSLog(@"======数据上传奔溃日志成功=========");
NSString * path = [[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject] stringByAppendingPathComponent:@"ExceptionLog.txt"];
[StatisRequestErrorData removeDocumentWithFilePath:path];
}
// 删除本地奔溃日志
+ (BOOL)removeDocumentWithFilePath:(NSString*)filePath{
BOOL isRemove = false;
NSFileManager* fileManager=[NSFileManager defaultManager];
if ([[NSFileManager defaultManager]fileExistsAtPath:filePath]) {
isRemove = [fileManager removeItemAtPath:filePath error:nil];
}
return isRemove;
}
@end
在AppDelegate中
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
//统计计奔溃日志
[StatisRequestErrorData showXcodeInfo];
return YES;
}
reason 是异常的原因
name 是异常的名称