当你看到防御式这三个字的时候,脑海里一定是这样想像的:
但是,今天我们讨论的防御式,是相当严肃的。这是一种编写代码时需要掌握而且要一直贯彻的思维,即一个方法或函数不能因为传入的错误数据而被破坏。
▍保护程序不要被输入的非法数据破坏
程序员在写代码的时候,经常会太过于相信上游调用方传入的数据,比如确信上游不可能传空值进来,从来不去做参数对象是否为空的判断。但是,凡事皆有可能,当某一天一个null对象被传入的时候,程序会被立刻crash。
对于外界的垃圾数据,应该:
检查所有来源于外部的数据的值。当从文件、用户、网络等外部接口获取数据时,应该检查所获得的数据值,以确保它在允许的范围内。
检查子程序所有传入的值。与检查外部数据一样,只不过数据来源于其它的子程序。
决定如何处理错误的输入数据。当检测出错误数据时,应该如何处理?
▍断言
断言(assert)是指在开发期间使用的,让程序在运行时自检的代码。断言为真,说明程序正常执行,若为假,则意味着发生了意料之外的错误。
一个断言通常有两个参数,一个描述假设为真时的布尔表达式,和一个断言为假时需要显示的内容。
Java Example of an Assertion
assert denominator != 0 : "denominator is unexpectedly equal to 0.";
程序员也可以自己建立或封装断言,定义自己的断言机制。
C++ Example of an Assertion Macro
#define ASSERT( condition, message ) {
if ( !(condition) ) {
LogError( "Assertion failed: “, #condition, message );
exit( EXIT_FAILURE );
}
}
对于断言的使用,有一些指导意见:
用错误处理代码来处理预期会发生的情况,用断言来处理绝不应该发生的情况;
避免把需要执行的代码放在断言中;
用断言来注解并验证前条件和后条件;
对于高健壮性的代码,应该先使用断言再使用错误处理。
▍错误处理技术
对于错误的处理,应该考虑以下几种方式:
返回中立值;
换用下一个正确的数据;
返回与前次相同的数据;
换用最接近的合法值;
把警告信息记录到日志中;
返回一个错误码;
调用错误处理子程序;
当错误发生时显示错误内容;
关闭程序
领取专属 10元无门槛券
私享最新 技术干货