美文网首页swift崩溃处理
iOS基础篇-NSException

iOS基础篇-NSException

作者: 亲爱的大倩倩 | 来源:发表于2019-06-26 18:03 被阅读0次

NSException类是专门表示异常的,当我们使用@throw方法抛出异常时,会让我们程序直接崩溃

/*如果没有则抛出异常
   exceptionWithName:异常的名称
   reason:异常的原因
   userInfo:异常的信息
**/
if (!setterMethod) {
        @throw [NSException exceptionWithName:NSInvalidArgumentException reason:[NSString stringWithFormat:@"%@:not this setter method",self] userInfo:nil];
    }

那么什么时候使用NSException呢?
当觉得某一段代码可能有问题时,我们就可以通过捕获异常,来防止程序崩溃

 @try {        
        //如果@try中的代码会导致程序崩溃,就会去到@catch
    }    
    @catch (NSException *exception) {        
        //如果@try中的代码有问题(导致崩溃),就会来到@catch
        //在这里可以进行相应的处理操作
        //如果你要抛出异常(让程序崩溃),就写上 @throw exception
    }    
    @finally {        
        //@finally中的代码是一定会执行的
    }

可以通过Runtime+分类+NSException,来防止Foundation一些常用方法使用不当而导致的崩溃
在分类中,通过runtime交换两个方法,在方法中捕获异常进行相应的处理

//为NSMutableArray创建分类
@interface NSMutableArray (Extension)


//交换方法
#import "NSMutableArray+Extension.h"
#include <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

//当向可变数组中添加nil时,不会崩溃
NSString *nilStr = nil;
NSMutableArray *arrayM = [NSMutableArray array];
[arrayM addObject:nilStr];

相关文章

  • iOS基础篇-NSException

    NSException类是专门表示异常的,当我们使用@throw方法抛出异常时,会让我们程序直接崩溃 那么什么时候...

  • iOS 动画基础总结篇

    iOS 动画基础总结篇 iOS 动画基础总结篇

  • iOS 16 闪退问题

    更新完iOS16之后编译旧项目出现以下问题 /* Exception NSException * "[<_...

  • NSException防止崩溃

    昨天剖析Dictionary+NilSafe防崩溃机制的时候,突然想到了iOS强大的NSException处理崩溃...

  • 强大的NSException

    一、NSException简介 1.什么是NSException? 说到NSException你可能不太了解,但是...

  • IOS 异常捕获NSException

    说一说 异常捕捉吧,这是我2015年接触的NSException ,现在想一想写下来,留个纪念吧。 Appdele...

  • iOS NSException异常处理

    为什么使用NSException 在平常的开发过程中,由于代码不严谨或者没有对参数做校验处理会造成程序crash,...

  • iOS 异常捕获

    iOS崩溃情况 一般是由 Mach异常或 Objective-C 异常(NSException)引起的。我们可以针...

  • iOS 静态库制作❣进阶

    如果没有看过 基础篇,从这里进入iOS 静态库制作❣基础篇。如果没有看过 中篇,从这里进入iOS 静态库制作❣中篇...

  • 2018-03-08

    ios基础篇:https://wangmeng.gitbooks.io/ios-note/content/inte...

网友评论

    本文标题:iOS基础篇-NSException

    本文链接:https://www.haomeiwen.com/subject/taaccctx.html