NSException

NSException

异常类:NSException

使用NSException实现异常处理。 异常是一种特殊情况,会中断程序的正常执行流程。 每个应用程序都有不同的原因可以中断程序。 例如,一个应用程序可能会将文件保存在受写保护的目录中作为例外。 从这个意义上讲,异常等同于错误。 另一个应用程序可能会将用户的按键解释(例如Control-C)解释为例外情况:表明长时间运行的进程应中止。

NSException有三个属性来解释当前异常的原因:
第一个:@property (readonly, copy) NSExceptionName name;//异常名称

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
NSExceptionName
NSGenericException;//一般异常.
NSRangeException;//尝试访问某些数据范围之外(例如,字符串末尾,访问数组越界值)时发生的异常的名称.
NSInvalidArgumentException;//将无效的参数传递给方法时发生的异常的名称,例如需要非nil对象的nil指针.
NSInternalInconsistencyException;//当内部声明失败并在被调用代码中隐含意外情况时发生的异常的名称,不一致造成的错误,如NSMutableDictionary有很多方法NSDictionary不能调用,但是却进行了调用.

NSMallocException;//内存不足异常,过时,目前没有使用

NSObjectInaccessibleException;//对象不可访问造成的异常
NSObjectNotAvailableException;//对象不可用,如使用UIAlterView废弃API,SceneDelegate删除同时需要删除info.plist等.
NSDestinationInvalidException;//目标无效异常,如子线程执行任务,但是执行任务之前子线程已经被释放.

NSPortTimeoutException;//端口接收或者发送超时异常
NSInvalidSendPortException;//无效发送端口造异常
NSInvalidReceivePortException;//无效接收端口异常
NSPortSendException;//端口发送异常
NSPortReceiveException;//端口接收异常

NSOldStyleException;//老样式异常

NSInconsistentArchiveException;//初始化或者编码有异常;

第二个:@property (nullable, readonly, copy) NSString * reason;//异常的原因
第三个:@property (nullable, readonly, copy) NSDictionary * userInfo;//异常的信息

判断可能会出现崩溃的代码@try…@catch… @finally

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//自主判断可能会出现崩溃的代码.
@try {
NSArray *arr = @[@"2",@"1"];
for (NSUInteger i = 0; i < 3; i ++) {
NSString *str = arr[i];
NSLog(@"str = %@",str);
}
} @catch (NSException *exception) {
NSLog(@"\n%@,\n%@,\n%@,",exception.reason,exception.name,exception.userInfo);
//@try如果崩溃则会来到这里
//本地保存上传服务器或者直接上传服务器
} @finally {
NSLog(@"finally无论崩溃都会执行");
}
//直接抛出一个异常,程序会直接崩溃
@throw [NSException exceptionWithName:NSRangeException reason:@"数组越界" userInfo:@{@"1":@"2"}];

收集NSException崩溃信息

崩溃时,先本地保存下次打开时候再把崩溃信息上传到服务器;

1
2
3
4
5
6
7
8
9
10
//崩溃监听方法,需要写在self.window.root... 之前
NSSetUncaughtExceptionHandler(&UncaughtExceptionHandler);
//UncaughtExceptionHandler C方法
void UncaughtExceptionHandler(NSException *exception){
NSLog(@"异常的监听:exception = %@",exception.name);
NSString *name = exception.name;
NSString *reason = exception.reason;
NSDictionary *info = exception.userInfo;
NSArray *arr1 = exception.callStackSymbols;
}