美文网首页swift崩溃处理
iOS基础篇-NSException

iOS基础篇-NSException

作者: 亲爱的大倩倩 | 来源:发表于2019-06-26 18:03 被阅读0次

    NSException类是专门表示异常的,当我们使用@throw方法抛出异常时,会让我们程序直接崩溃

    /*如果没有则抛出异常
       exceptionWithName:异常的名称
       reason:异常的原因
       userInfo:异常的信息
    **/
    if (!setterMethod) {
            @throw [NSException exceptionWithName:NSInvalidArgumentException reason:[NSString stringWithFormat:@"%@:not this setter method",self] userInfo:nil];
        }
    

    那么什么时候使用NSException呢?
    当觉得某一段代码可能有问题时,我们就可以通过捕获异常,来防止程序崩溃

     @try {        
            //如果@try中的代码会导致程序崩溃,就会去到@catch
        }    
        @catch (NSException *exception) {        
            //如果@try中的代码有问题(导致崩溃),就会来到@catch
            //在这里可以进行相应的处理操作
            //如果你要抛出异常(让程序崩溃),就写上 @throw exception
        }    
        @finally {        
            //@finally中的代码是一定会执行的
        }
    

    可以通过Runtime+分类+NSException,来防止Foundation一些常用方法使用不当而导致的崩溃
    在分类中,通过runtime交换两个方法,在方法中捕获异常进行相应的处理

    //为NSMutableArray创建分类
    @interface NSMutableArray (Extension)
    
    
    //交换方法
    #import "NSMutableArray+Extension.h"
    #include <objc/runtime.h>
    @implementation NSMutableArray (Extension)
    + (void)load{
        Class arrayMClass = NSClassFromString(@"__NSArrayM");
        //获取系统的添加元素的方法
        Method addObject = class_getInstanceMethod(arrayMClass, @selector(addObject:));
        //获取我们自定义添加元素的方法
        Method avoidCrashAddObject = class_getInstanceMethod(arrayMClass, @selector(avoidCrashAddObject:));
        //将两个方法进行交换
        //当你调用addObject,其实就是调用avoidCrashAddObject
        //当你调用avoidCrashAddObject,其实就是调用addObject
        method_exchangeImplementations(addObject, avoidCrashAddObject);
    }
    
    - (void)avoidCrashAddObject:(id)anObject {
        @try {
            [self avoidCrashAddObject:anObject];
            //其实就是调用addObject
        }
        @catch (NSException *exception) {
            //能来到这里,说明可变数组添加元素的代码有问题
            //你可以在这里进行相应的操作处理
            NSLog(@"异常名称:%@   异常原因:%@",exception.name, exception.reason);
        }
        @finally {
            //在这里的代码一定会执行,你也可以进行相应的操作
        }
    }
    @end
    
    //当向可变数组中添加nil时,不会崩溃
    NSString *nilStr = nil;
    NSMutableArray *arrayM = [NSMutableArray array];
    [arrayM addObject:nilStr];
    

    相关文章

      网友评论

        本文标题:iOS基础篇-NSException

        本文链接:https://www.haomeiwen.com/subject/taaccctx.html