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

上面这张图想必大家都不陌生吧!(卧槽,程序又崩溃了)。
其实控制台输出的日志信息就是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;
}
崩溃截图如下

为什么说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];
控制台输出截图如下
NSException的更多相关文章
- 异常:NSException和NSAssert的简单使用
//断言 - (void)NSAssert_Test:(NSString *)string{ NSAssert(string == nil, @"string == kong or nil& ...
- NSException异常处理
异常处理是管理非典型事件(例如未被识别的消息)的过程,此过程将会中断正常的程序执行.如果没有足够的错误处理,遇到非典型事件时,程序可能立刻抛出(或者引发)一种被称之为异常的东西,然后结束运行. 异常的 ...
- iOS 利用异常 NSException 调试代码
可以用在代码的调试上: -(instancetype)init{ @throw [NSException exceptionWithName:@"Singleton" reason ...
- mac python3 conda pytorch出错:libc++abi.dylib: terminating with uncaught exception of type NSException
mac 10.14/ conda/python 3.7环境下运行神经网络例子出现错误: -- :::] -[NSApplication _setup:]: unrecognized selector ...
- IOS Exception 1(libc++abi.dylib: terminating with uncaught exception of type NSException)
2014-08-05 22:18:46.455 SwiftUI[1329:40871] -[_TtC7SwiftUI14MViewControler clickMe]: unrecognized se ...
- Foundation框架 - NSException类
NSException类 WBStudentManager.h #import <Foundation/Foundation.h> NSString* const NameInvalidE ...
- 新浪微博分享出现libc++abi.dylib: terminating with uncaught exception of type NSException微博微信SDK运行编译报错
SDK出现libc++abi.dylib: terminating with uncaught exception of type NSException 的问题: 解决方法 结合 # 监测bug( ...
- 系统异常 NSException.h
FOUNDATION_EXPORT NSExceptionName const NSGenericException; FOUNDATION_EXPORT NSExceptionName const ...
- libc++abi.dylib: terminating with uncaught exception of type NSException (lldb)
In Xcode 9 and Swift 4: Print exception stack to know the reason of the exception: Go to show break ...
随机推荐
- Creating Excel File in Oracle Forms
Below is the example to create an excel file in Oracle Forms.Pass the Sql query string to the below ...
- jQuery插件之jquery editable plugin--点击编辑文字插件
jeditable是一个jquery插件,它的优点是可以就地编辑,并且提交到服务器处理,是一个不可多得的就地编辑插件.(注: 就地编辑,也有称即时编辑?一般的流程是这样的,当用户点击网页上的文字时,该 ...
- 序列的方法(str,list,tuple)
作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 在快速教程中,我们了解了最基本的序列(sequence).回忆一下,序列包含有定值 ...
- php 连接mysql的问题
当前我的情况是安装上mysql配置了my.cnf中的socket,并且在指定位置也生成了 mysql.sock 的sock文件,此时我通过php.ini来设置php连接mysql.sock的文件,但是 ...
- windows下的Git简单入手
现在再搞golang,用go get github.com/xxx 命令使需要git.提交新项目到github.com也要git,老东西了,呵呵现在也要学习一下. 下载windows版的git. ·准 ...
- 解决使用jQuery采用append添加的元素事件无效的方法
<html> <head> <script type="text/javascript" src="/jquery/jquery.js&qu ...
- JS 和 Java 中URL特殊字符编码方式
前几天遇到url特殊字符编码的问题,在这里整理一下: JavaScript 1. 编码 escape(String) 其中某些字符被替换成了十六进制的转义序列. 解码 unescape(String ...
- h5 input file ajax实现文件上传
<input type="file" accept="image/*" height="0" class="file_inp ...
- 转:c++类实例在内存中的分配
转自:http://blog.csdn.net/alexwei2009/article/details/6157926 c++是一种面向对象的编程语言,它向下保持了对c的兼容,同时也允许程序员能够自由 ...
- OpenGL的glScalef缩放变换函数详解
glScalef是openGL中的模型缩放函数,就是把当前矩阵与一个表示延各个轴对物体进行拉伸.压缩.反射的矩阵相乘.这个物体的每个点的x,y,z坐标与对应的xyz参数相乘. 先看函数定义void g ...