swift崩溃处理

iOS基础篇-NSException

2019-06-26  本文已影响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];
上一篇 下一篇

猜你喜欢

热点阅读