掌握防御式编程,让你的代码更加健壮

当你看到防御式这三个字的时候,脑海里一定是这样想像的:

但是,今天我们讨论的防御式,是相当严肃的。这是一种编写代码时需要掌握而且要一直贯彻的思维,即一个方法或函数不能因为传入的错误数据而被破坏。

▍保护程序不要被输入的非法数据破坏

程序员在写代码的时候,经常会太过于相信上游调用方传入的数据,比如确信上游不可能传空值进来,从来不去做参数对象是否为空的判断。但是,凡事皆有可能,当某一天一个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 );

}

}

对于断言的使用,有一些指导意见:

用错误处理代码来处理预期会发生的情况,用断言来处理绝不应该发生的情况;

避免把需要执行的代码放在断言中;

用断言来注解并验证前条件和后条件;

对于高健壮性的代码,应该先使用断言再使用错误处理。

▍错误处理技术

对于错误的处理,应该考虑以下几种方式:

返回中立值;

换用下一个正确的数据;

返回与前次相同的数据;

换用最接近的合法值;

把警告信息记录到日志中;

返回一个错误码;

调用错误处理子程序;

当错误发生时显示错误内容;

关闭程序

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20181027A0CF7D00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券