NSException 程序崩溃日志

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


崩溃截图.png

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

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


NSException  是一种出错会调用的类,可以用它判断 ,我们认为不会导致程序崩溃的代码。
 列子:
NSString *nilString = nil;
NSMutableArray *arrayMu = [NSMutableArray array];
@try {
//如果这里面的代码执行后会导致程序崩溃,就会跳到@catch这个方法中
[arrayMu addObject:nilString];//我们猜想这句会导致程序崩溃,放在这里,然后看是否执行@catch这个方法,执行就会导致崩溃,没有执行就不会导致崩溃

 }
@catch(NSException *exception){
//如果@try中的代码有问题(导致崩溃)就会来到@catch这个方法中
可以在这里添加一些处理崩溃的操作
如果要电脑显示崩溃需要添加
@throw  exception
}
@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 <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];

控制台输出截图如下


捕获到的异常信息.png




























  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值