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];
网友评论