《Windows核心编程》の防御性编程--断言
防御性编程是提高软件质量技术的有益辅助手段,它的主要思想是:子程序应该不因传入错误数据而被破坏,哪怕是由其他子程序产生的错误数据。防御性编程关键在于严格的输入检查、预期的错误处理方法。下面介绍使用断言来进行防御性编程。
断言通常是一个例程(routine)或一个宏(macros),断言通常包含有两个参数:布尔表达式和消息。布尔表达式的反面是一个错误,C标准库提供了一个assert宏,它只带有一个参数,如:
assert(1==0); //注意布尔表达式不用加引号
使用assert宏,需要包含头文件cassert或assert.h,执行上述语句的结果是程序结束运行,并弹出对话框显示出错信息。
我们可以自定义assert宏,有两个目的:
1)新增参数。例如新增一个消息参数,使assert宏输出更为丰富的信息;
2)改变assert的行为内容。C标准库中的assert宏将中断程序,可以让程序继续运行而不中断或者进入调试状态等,另外还可以控制消息输出的目标,即控制消息是输出到控制台还是文本文件,甚至是通过网络发出。
下面是一个C++实现的自定义断言:
#ifdef _DEBUG
#define Assert(exp, message) /
{ /
if(!(exp)) /
{ /
std::cout<<"Assertion failed: "<<#exp<<"/n" /
<<"Message: "<<message<<"/n" /
<<"line: "<<__LINE__<<"/n" /
<<"file: "<<__FILE__<<"/n"; /
exit(EXIT_FAILURE); /
} /
}
#else
#define Assert(exp, message)
#endif
使用断言应注意的问题:
1)对非预期错误使用断言。非预期错误包括空指针、输入或输出的参数值不在预期范围内、数组的越界等;
2)不要把需要执行的代码放入断言中。断言用于软件的开发和维护,通常不在发行版本中包含断言。把需要运行的代码放入断言中,在发行版本中这些代码通常不会被执行;
3)对来源于内部系统的可靠数据使用断言,而不要对外部不可靠数据使用断言,对于外部不可靠数据应该使用错误处理代码。
posted on 2010-10-12 21:50 android开发实例 阅读(349) 评论(0) 编辑 收藏 举报