基础知识

NSException防止崩溃

2018-02-01  本文已影响81人  woniu

昨天剖析Dictionary+NilSafe防崩溃机制的时候,突然想到了iOS强大的NSException处理崩溃的类,只不过和Dictionary+NilSafe不同的是,Dictionary+NilSafe会剔除掉导致崩溃的数据,正常的数据还是会正常使用。但是NSException则是截住这个崩溃并可以输出相应的信息,但是整个数据我们是都用不了了。下面我们来进一步分析一下NSException:

一、什么是NSException?

NSException掌控者程序的命运,程序的崩溃就是由NSException来控制的。一旦崩溃就
会出现NSException信息。

二、NSException使用场景?

A、自身封装SDK,若要保证SDK稳定且不崩溃,又要提示哪里出问题了,那么就可以使用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;//崩溃内容
上一篇下一篇

猜你喜欢

热点阅读