最熟悉的陌生人,这是我对NSException的概述,为何这么说呢?其实不少开发者接触到NSException的频率很是频繁,但不少人都不知道什么是NSException,不知道如何使用NSException。下面从一张截图开始讲起NSException。数组
上面这张图想必你们都不陌生吧!(卧槽,程序又崩溃了)。ui
其实控制台输出的日志信息就是NSException产生的,一旦程序抛出异常,程序就会崩溃,控制台就会有这些崩溃日志。spa
下面代码就会让你的程序崩溃
3d
//异常的名称 NSString *exceptionName = @"自定义异常"; //异常的缘由 NSString *exceptionReason = @"我长得太帅了,因此程序崩溃了"; //异常的信息 NSDictionary *exceptionUserInfo = nil; NSException *exception = [NSException exceptionWithName:exceptionName reason:exceptionReason userInfo:exceptionUserInfo]; NSString *aboutMe = @"太帅了"; if ([aboutMe isEqualToString:@"太帅了"]) { //抛异常 @throw exception; }
崩溃截图以下
日志
NSException掌控着程序的生命,程序的崩溃就是NSException来控制的,你说NSException不强大吗?那为什么要NSException来使程序崩溃呢?其实主要的出发点是让开发者认识到哪里的代码有问题。code
下面说两个NSException的实用技巧吧orm
NSString *nilStr = nil; NSMutableArray *arrayM = [NSMutableArray array]; @try { //若是@try中的代码会致使程序崩溃,就会来到@catch //将一个nil插入到可变数组中,这行代码确定有问题 [arrayM addObject:nilStr]; } @catch (NSException *exception) { //若是@try中的代码有问题(致使崩溃),就会来到@catch //在这里你能够进行相应的处理操做 //若是你要抛出异常(让程序崩溃),就写上 @throw exception } @finally { //@finally中的代码是必定会执行的 //你能够在这里进行一些相应的操做 }
添加分类,利用runtime交换方法
blog
// // NSMutableArray+Extension.m // categoryTest // // Created by mac on 16/10/6. // Copyright © 2016年 chenfanfang. All rights reserved. // #import "NSMutableArray+Extension.h" #import <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
验证上面的代码的确能够捕获异常,而且不会崩溃
开发
NSString *nilStr = nil; NSMutableArray *arrayM = [NSMutableArray array]; [arrayM addObject:nilStr];
控制台输出截图以下
get