博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
iOS被开发者遗忘在角落的NSException-其实它很强大
阅读量:5295 次
发布时间:2019-06-14

本文共 2722 字,大约阅读时间需要 9 分钟。

NSException是什么?

最熟悉的陌生人,这是我对NSException的概述,为什么这么说呢?其实很多开发者接触到NSException的频率非常频繁,但很多人都不知道什么是NSException,不知道如何使用NSException。下面从一张截图开始讲起NSException。

 
崩溃截图.png  图太大了 放最后了
 

上面这张图想必大家都不陌生吧!(卧槽,程序又崩溃了)。

其实控制台输出的日志信息就是NSException产生的,一旦程序抛出异常,程序就会崩溃,控制台就会有这些崩溃日志。


NSException的基本用法

下面代码就会让你的程序崩溃

//异常的名称    NSString *exceptionName = @"自定义异常";    //异常的原因    NSString *exceptionReason = @"我长得太帅了,所以程序崩溃了"; //异常的信息 NSDictionary *exceptionUserInfo = nil; NSException *exception = [NSException exceptionWithName:exceptionName reason:exceptionReason userInfo:exceptionUserInfo]; NSString *aboutMe = @"太帅了"; if ([aboutMe isEqualToString:@"太帅了"]) { //抛异常 @throw exception; }

崩溃截图如下

 
自定义异常崩溃截图.png
 
 

为什么说NSException很强大

NSException掌控着程序的生命,程序的崩溃就是NSException来控制的,你说NSException不强大吗?那为何要NSException来使程序崩溃呢?其实主要的出发点是让开发者认识到哪里的代码有问题。

下面说两个NSException的实用技巧吧

  • 1、 若自己封装一套SDK,若要提示哪里出错,那么就可以使用NSException。就像上面NSException的基本用法中的代码一样。
  • 2、可以用来捕获异常,防止程序的崩溃。当你意识到某段代码可能存在崩溃的危险,那么你就可以通过捕获异常来防止程序的崩溃。代码如下
NSString *nilStr = nil;    NSMutableArray *arrayM = [NSMutableArray array];        @try { //如果@try中的代码会导致程序崩溃,就会来到@catch //将一个nil插入到可变数组中,这行代码肯定有问题 [arrayM addObject:nilStr]; } @catch (NSException *exception) { //如果@try中的代码有问题(导致崩溃),就会来到@catch //在这里你可以进行相应的处理操作 //如果你要抛出异常(让程序崩溃),就写上 @throw exception } @finally { //@finally中的代码是一定会执行的 //你可以在这里进行一些相应的操作 }
  • 3、最最实用的一个技术点就是利用 分类(category) + runtime + 异常的捕获 来防止Foundation一些常用方法使用不当而导致的崩溃。其原理就是利用category、runtime来交换两个方法,并且在方法中捕获异常进行相应的处理。(这里需要了解一些关于runtime的知识点,若对runtime不熟悉的朋友,可以先去了解下runtime的方法交换)。下面直接附上大概的使用方法。

添加分类,利用runtime交换方法

////  NSMutableArray+Extension.m//  categoryTest//// Created by mac on 16/10/6. // Copyright © 2016年 chenfanfang. All rights reserved. // #import "NSMutableArray+Extension.h" #import 
@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];

控制台输出截图如下

 
捕获到的异常信息.png

 

 

 

 

转载于:https://www.cnblogs.com/tangyuanby2/p/10567198.html

你可能感兴趣的文章
每日一库:Modernizr.js,es5-shim.js,es5-safe.js
查看>>
目录相关的操作
查看>>
解决虚拟机vmware安装64位系统“此主机支持 Intel VT-x,但 Intel VT-x 处于禁用状态”的问题...
查看>>
C++----练习--引用头文件
查看>>
11.基本包装类型
查看>>
ajax连接服务器框架
查看>>
wpf样式绑定 行为绑定 事件关联 路由事件实例
查看>>
利用maven管理项目之POM文件配置
查看>>
用HttpCombiner来减少js和css的请问次数
查看>>
FUSE-用户空间文件系统
查看>>
将tiff文件转化为jpg文件并保存
查看>>
ubuntu 16.04 开机脚本
查看>>
 VS2012 C#调用C++ dll
查看>>
TCL:表格(xls)中写入数据
查看>>
SQL SERVER 2005中如何获取日期(一个月的最后一日、一年的第一日等等)
查看>>
django 学习笔记(转)
查看>>
控制台程序秒变Windows服务(Topshelf)
查看>>
字节流与字符流的区别详解
查看>>
20141026--娱乐-箱子
查看>>
自定义分页
查看>>