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的更多相关文章

  1. 异常:NSException和NSAssert的简单使用

    //断言 - (void)NSAssert_Test:(NSString *)string{ NSAssert(string == nil, @"string == kong or nil& ...

  2. NSException异常处理

    异常处理是管理非典型事件(例如未被识别的消息)的过程,此过程将会中断正常的程序执行.如果没有足够的错误处理,遇到非典型事件时,程序可能立刻抛出(或者引发)一种被称之为异常的东西,然后结束运行. 异常的 ...

  3. iOS 利用异常 NSException 调试代码

    可以用在代码的调试上: -(instancetype)init{ @throw [NSException exceptionWithName:@"Singleton" reason ...

  4. 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 ...

  5. 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 ...

  6. Foundation框架 - NSException类

    NSException类 WBStudentManager.h #import <Foundation/Foundation.h> NSString* const NameInvalidE ...

  7. 新浪微博分享出现libc++abi.dylib: terminating with uncaught exception of type NSException微博微信SDK运行编译报错

    SDK出现libc++abi.dylib: terminating with uncaught exception of type NSException  的问题: 解决方法 结合 # 监测bug( ...

  8. 系统异常 NSException.h

    FOUNDATION_EXPORT NSExceptionName const NSGenericException; FOUNDATION_EXPORT NSExceptionName const ...

  9. 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 ...

随机推荐

  1. 用ubuntu下载电影:磁力链接,torrent,迅雷链接

    用ubuntu下载电影:磁力链接,torrent,迅雷链接 操作系统:Ubuntu 14.04 64位 需要软件:Ktorent, Amule 安装软件: sudo apt-get install k ...

  2. choco命令

    C:\Users\Administrator>chocoChocolatey v0.10.0 C:\Users\Administrator>choco --version0.10.0 C: ...

  3. git学习笔记03-本地git常用操作及原理-文件增删改

    1.查看git状态 git status  这个可以告诉我们对git做了哪些操,比如增删改 2.既然我们修改了东西,有的时候想看看修改了什么,毕竟我们的记忆力并不如电脑 git diff 文件名 (默 ...

  4. Scrum Meeting---Ten(2015-11-5)

    今日已完成任务和明日要做的任务 姓名 今日已完成任务 今日时间 明日计划完成任务 估计用时 董元财 分类页设计 4h 商品详单设计 4h 胡亚坤 首页设计 2h 滚动广告栏设计 2h 刘猛 服务器测试 ...

  5. JZs3c2440裸板程序GPIO操作总结

    分别用汇编,汇编+C两种方式 ***************************************汇编编程led_on.s********************************** ...

  6. sgu-508 Black-white balls 概率-贝叶斯公式

    题意:有n个球,其中有0.1.2...n个黑球的概率是相等的,现在从中取出L个球,p个黑球q个白球.现在问猜一个黑球的区间,使得落在这个区间的概率大于给定的一个数值. 详见代码: #include & ...

  7. Python学习(21)python操作mysql数据库_操作

    目录 数据库连接 创建数据库表 数据库插入操作 数据库查询操作 数据库更新操作 删除操作 执行事务 错误处理 数据库连接 连接数据库前,请先确认以下事项: 您已经创建了数据库 TEST. 在TEST数 ...

  8. python中的最最最基本语法(1)

    注意:对于我这个以前用c/c++的同学来说,可能一开始学习pyhon时有点不适应的,为什么呢?因为吧,python中,没有这玩意:{},也不用每句话才用分号分开的.python中通过缩进来分块的,一行 ...

  9. STM32学习笔记(三) STM32的GPIO的深入学习

    STM32的开发学习主要涉及软硬件两个部分的实现,包含众多外设和总线的理解配置.STM32的整个学习曲线并不陡峭,但入门却相当困难,因此在学习之初,多动手实验和测试相当重要,GPIO作为整个STM32 ...

  10. POJ 3468(树状数组的威力)

    之前说过这是线段树的裸题,但是当看了http://kenby.iteye.com/blog/962159 这篇题解后我简直震惊了,竟然能如此巧妙地转化为用树状数组来处理,附上部分截图(最好还是进入原网 ...