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__ : @"<Unknown 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];
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,886评论 18 139
  • 一直想写一篇你关于断言的文章, 今天有时间赶紧写出来.参考 Mattt 文章 一、Objective - C 中的...
    Mitchell阅读 11,085评论 1 24
  • 1. SAML断言 断言是一个包含零个或更多个由SAML权威做出的声明的信息包。 SAML断言通常与由 元素表示的...
    WebSSO阅读 1,435评论 0 1
  • linux资料总章2.1 1.0写的不好抱歉 但是2.0已经改了很多 但是错误还是无法避免 以后资料会慢慢更新 大...
    数据革命阅读 12,218评论 2 33
  • 就目前的的理解来看,spu和sku没有实质界限。完全根据产品的细腻度来划分。有这么个概念还是有助于设计数据库吧。
    离子来了阅读 682评论 0 2