NSException防止崩溃
昨天剖析Dictionary+NilSafe防崩溃机制的时候,突然想到了iOS强大的NSException处理崩溃的类,只不过和Dictionary+NilSafe不同的是,Dictionary+NilSafe会剔除掉导致崩溃的数据,正常的数据还是会正常使用。但是NSException则是截住这个崩溃并可以输出相应的信息,但是整个数据我们是都用不了了。下面我们来进一步分析一下NSException:
一、什么是NSException?
NSException掌控者程序的命运,程序的崩溃就是由NSException来控制的。一旦崩溃就
会出现NSException信息。
二、NSException使用场景?
A、自身封装SDK,若要保证SDK稳定且不崩溃,又要提示哪里出问题了,那么就可以使用NSException。
-
先吐下苦水:这点我深有体会,我在公司做SDK的时候,客户最敏感的就是SDK导致的APP崩溃,由于面对的使用情况比较复杂。比如:
a:SDK提供的参数类型是NSString,但是开发者传了NSNumber类型.
b:方法随意调用也可能导致崩溃。
c:SDK内部对nil的处理不足导致的崩溃。所以有一个防崩溃的机制是至关重要的,当然首先我们要在SDK内部处理好各种情况
导致的有可能的崩溃,并去掉这个数据以保证SDK采集的数据能够发送。
当然有人可能会问了,为什么不直接用NSException呢?答案我们在开始的时候已经说
了,使用NSException一旦遇到崩溃,那么SDK采集的正常的数据也无法正常发送了,
所以我们尽量在SDK内部处理好崩溃点,并剔除那些导致崩溃的参数,以求保全尽可能
多的数据。(跟我喊:德玛西亚·额......客户至上!数据万岁!)
而NSException则是不得已而为之,因为总有些崩溃的情况是你意想不到的,所以使用 NSException以防不测。
B、可以用来自己捕获异常,防止程序崩溃。我们可以在有可能崩溃的地方来捕获崩溃,同时不让APP崩溃。
三、NSException的优缺点
优点吗就是可以防止APP崩溃,但是相应的代价是会占用一些系统资源。
古语有云:世上安得双全法,不负崩溃不负CPU。诸君看负哪一个吧。
四、NSException防崩溃方法实例:
@try {
// 可能会出现崩溃的代码
NSString *san = nil;
NSDictionary *dic =@{@"wang":san,@"zhang":@"san",@"li":@"si"};
NSLog(@"@try@catch不可变字典为:%@",dic);
//这里没有打印数据,直接被catch接收了
} @catch (NSException *exception) {
// 捕获到的异常exception,并打印想关信息
NSLog(@"main: Caught %@: %@", [exception name], [exception reason]);
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"我们在主线程里面可以弹出捕获的异常信息");
});
} @finally {
// 此处的代码不管有没有捕获崩溃都会被执行。
NSLog(@"main:崩溃处理完毕,在此处可以进行一些相应的操作");
}
崩溃打印信息:
main: Caught NSInvalidArgumentException: *** -[__NSPlaceholderDictionary
initWithObjects:forKeys:count:]: attempt to insert nil object from objects[0]
五、NSException对应的重要方法属性
+ (NSException *)exceptionWithName:(NSExceptionName)name reason:(nullable NSString *)reason userInfo:(nullable NSDictionary *)userInfo;
- (instancetype)initWithName:(NSExceptionName)aName reason:(nullable NSString *)aReason userInfo:(nullable NSDictionary *)aUserInfo NS_DESIGNATED_INITIALIZER;
@property (readonly, copy) NSExceptionName name; //崩溃名称
@property (nullable, readonly, copy) NSString *reason;//崩溃原因
@property (nullable, readonly, copy) NSDictionary *userInfo;//崩溃内容