在代码编程中使用断言来预警意想不到的情况发生是非常好的习惯并且会节省很多调试时间,使我们高效的开发程序.
如果想看专业的名词解释可以参看:http://zh.wikipedia.org/wiki/%E6%96%B7%E8%A8%80_(%E7%A8%8B%E5%BC%8F)
下面是我参看了<代码大全>中第八章防御式编程 的内容简要总结的,
我们在编写函数的时候,要做到:
1.检查所有来源于外部的值
2.检查子程序所有输入的参数的值
3.对传入的错误的值进行处理
对于断言的使用的一些建议:
1.用错误处理代码来处理预期会发生的情况,用断言来处理绝不该发生的状况.
2.避免把需要执行的代码放到断言中.因为断言在Debug模式下是生效的,但在Release模式在无效,这样就会丢失执行代码.
3.用断言来注释并验证前条件和后条件.
4.对于高健壮的代码,应先使用断言,再处理错误.
对于错误的处理,有大致几种方式:
1.返回中立值
2.换用一个正确的数据
3.返回与前次相同的数据
4.换用最近的合法值
5.把警告信息记录到日志文件中
6.返回一个错误码
7.调用错误处理子程序或对象
8.当错误发生时显示出错消息
9.用最妥当的方式在局部处理错误
10.关闭程序.
以上这些错误处理方式我们可以有选择的采用处理.
断言是一种防御式代码,然而防御式代码不只是无损的,加入防御式可能也会使我们的代码冗余,繁琐,对于我们应该添加多少断言,有以下一些建议:
1.保留那些检查重要错误的代码
2.去掉检查细微错误的代码
3.去掉可以导致程序硬性崩溃的代码
4.保留可以让程序稳妥的崩溃的代码
5.为你的技术支持人员记录信息
6.确认留在代码中的错误消息是友好的
在iOS中,断言在Debug下生效,在Release下失效是系统默认的,不过我们也可以更改.
系统框架Foundation中的NSException类定义了断言的宏供我们方便的调用,其中有6种方式
NSAssert NSAssert1, NSAssert2, NSAssert3, NSAssert4, NSAssert5
NSAssert1至 NSAssert5是在 NSAssert的基础上给描述信息参数添加变量的个数.
比如下面的函数,表示如果调用者传递的NSString参数为空,就会使断言生效,触发使程序停止,并打印相关信息.
这些信息默认包括:调用堆栈和描述信息.
- (void)testAssert:(NSString *)str {
NSAssert(str != nil, @"这里是断言的描述,可以带参数,会打印在控制台");
}
总之,我认为尽量在重要代码中添加断言,可以使我们的程序更健壮一些.