代码大全第8章:防御式编程

保护程序免遭非法输入数据的破坏

  • 不管进来什么,好的程序都不会生成垃圾。做到垃圾进,什么都出进来垃圾,出去错误提示不许垃圾进来
  • 通常有三种方法处理进来垃圾的情况:
    • 检查所有来源于外部数据的值
    • 检查子程序所有输入参数的值
    • 决定如何处理错误的输入数据

断言

  • 用错误来处理预期会发生的情况,用断言来处理绝不应该发生的情况。错误处理通常用来检查有害的输入数据,断言用于检查代码中的bug。
  • 避免把需要执行的代码放到断言中。
  • 用断言来注解并验证前条件和后条件。前条件是调用子程序前要确保为真的属性,后条件是子程序执行结束后要确保为真的属性。
  • 对于高健壮性的代码,应该先使用断言再处理错误。

错误处理技术

  • 返回中立值,比如数值计算可以返回0,字符串操作可以返回空字符串,指针操作可以返回一个空指针,视频游戏中的绘图子程序收到了错误的颜色输入,可以使用默认背景色。但对于某些重要场景不适用,比如癌症病人的X光片绘图子程序。
  • 换用下一个正确数据,比如遍历温度计温度,发现错误跳过即可。
  • 返回与前次相同的数据,处理温度计温度的子程序也可以在发现错误时返回上一个读数,基于温度在短时间内不会有太大变化这一事实。但重要场景最好不要这样做,比如管理取款机上的交易。
  • 换用最接近的合法值,比如温度计已经校准在0-100间,检测到负数时,可以替换为0。
  • 把警告消息记录到日志文件中。
  • 返回一个错误码。
  • 调用错误处理子程序。
  • 错误发生时显示出错消息。
  • 在局部处理错误,这种方式的风险在于处理错误的地方十分分散。
  • 关闭程序。

异常

  • 把错误或异常事件传递给调用方的一种手段,如果在子程序遇到了预料之外的情况,但不知道如何处理。就可以抛出一个异常。

隔离程序

  • 以防御式编程为目的进行隔离的一种方法,是把某些接口选定为安全区域的边界,对穿越安全区域边界的数据进行合法性校验,并当数据非法时做出敏锐的反映。

在这里插入图片描述

  • 隔栏的使用使断言和错误处理有了清晰的区分。隔栏外部的程序应使用错误处理技术,在那里对数据的任何假定都是不安全的。而隔栏内部的程序应使用断言技术,因为传进来的数据已在通过隔栏时被清理过了。如果隔栏内部的某个子程序检测到错误数据,那应该是程序错误而非数据错误。

辅助调试的代码

  • 在开发环节中,越早引入辅助调试的代码,它能够提供的帮助也越大。
  • 应该以这么一种方式来处理异常情况:在开发阶段让它显现出来,在产品代码运行时让它能够自我回复。比如switch case的default分支,开发阶段可以进行报警,而最终的产品代码可以仅打印日志。

确定在产品代码中该保留多少防御式代码

  • 保留那些检查重要错误的代码。去掉检查细微错误的代码。
  • 去掉导致程序硬性崩溃的代码。保留可以让程序稳妥崩溃的代码。
  • 记录错误到日志中,返回给用户的消息要友好。

对防御式编程采取防御的姿态

  • 不要过度防御
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值