iOS-NSAssert/NSException的使用

NSAssert:又称为断言,它是一个宏,通过判断条件表达式NSAssert(),判定是否属于BUG,从而提醒开发者代码中出现的不合理情况,同时可以自定义错误信息.
条件表达式如下,condition为判断条件,当其中的条件不满足时才抛出错误,(也就是condition返回NO的情况),desc就是错误信息,可以自己定义

NSAssert(condition, desc)

在写无限轮播的代码中,我有一个判断图片轮播的时间间隔是否合理,如果时间间隔<0.01s就判定为不合理,抛出异常,代码如下

if (timer <= 0.01) {
        NSAssert(timer < 0.01, @"定时器时间间隔过短");
        return NO;
    }

控制台打印如下,除了错误信息,还打印了错误的文件名和行号YPCycleView.m:164

/Users/peiyang/Desktop/PictureScroll/12-17-无限轮播/12-17-无限轮播/YPCycleView.m:164
2016-12-18 11:56:21.429 12-17-无限轮播[19020:653771] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '定时器时间间隔过短'

通过源码我们能很快定义到对应的关键字__FILE____LINE__,前者是打印文件名,后者是打印对应的行号.
接下来我们来看看它在系统中的定义,在代码中有一个NSAssertionHandler类,用来处理断言的失败情况,失败情况出现时会传递一个字符串给NSAssertionHandler对象来描述失败的原因。每个线程都有自己的NSAssertionHandler对象。当调用时,一个断言处理器会打印包含方法和类(或函数)的错误消息,并引发一个NSInternalInconsistencyException异常。

#if !defined(_NSAssertBody)
#define NSAssert(condition, desc, ...)  \
    do {                \
    __PRAGMA_PUSH_NO_EXTRA_ARG_WARNINGS \
    if (!(condition)) {     \
            NSString *__assert_file__ = [NSString stringWithUTF8String:__FILE__]; \
            __assert_file__ = __assert_file__ ? __assert_file__ : @""; \
        [[NSAssertionHandler currentHandler] handleFailureInMethod:_cmd \
        object:self file:__assert_file__ \
            lineNumber:__LINE__ description:(desc), ##__VA_ARGS__]; \
    }               \
        __PRAGMA_POP_NO_EXTRA_ARG_WARNINGS \
    } while(0)
#endif

在DEBUG模式下才会打印NSASSert的情况,在Release模式下是不会打印错误信息的.

NSException:

 NSException *excp = [NSException exceptionWithName:@"FileError" reason:@"笨蛋,文件不存在或者不是文件夹,请好好检查" userInfo:nil];
        [excp raise];

你可能感兴趣的:(iOS-NSAssert/NSException的使用)