代码大全2 防御式编程
作者:@kuaiquxie
作者的github:https://github.com/bitebita
本文为作者原创,如需转载,请注明出处:https://www.cnblogs.com/dzwj/p/15768352.html
防御式编程该怎么认识呢,在其他程序员犯下错误时保护你自己,一个子程序不因传入错误数据而被破坏,也就是说程序都会出现问题,需要时时修改。
断言对于一些大型程序来说,是很有用的,这样能够更快排查出程序哪里出现的错误,断言可以在程序中说明各种假定,澄清各种不希望出现的情形,当然,断言是在程序开发、维护阶段去写的,没有必要让客户也看到这些。
下面给出一些使用断言的一些基本的建议:
1.用错误处理代码来处理预期会发生的情况,用断言来处理绝不可能发生的状况,用断言来检查代码中的bug。
2.将需要执行的代码放在断言之外,这样执行代码的时候就不用考虑这些代码会不会不被执行,这是需要自己多注意的一点。
3.用断言去注解并验证前条件和后条件。
4.对于一些可能会出错的条件,要么使用断言来处理错误,要么使用错误处理代码。两者只能选择其一。
错误处理技术:
返回中立值
换用下一个正确的数据
返回与前次相同的数据
将警告信息记录到日志中
返回一个错误码
调用错误处理子程序或对象
错误发生时显示出错信息
用最妥当的方式在局部处理错误
要不你就直接关闭程序
健壮性与正确性:正确性就是永远不返回不准确的值;健壮性就是不断采取措施,保证软件能够持续运行下去,软件倾向于健壮性。
防御式编程的重点就是在于防御一些自己未曾预料的错误
异常是把代码中的错误或者异常传递给调用方的特殊手段:
1.用异常通知程序的其他部分,发送了不可忽略的错误,异常有一种无法被忽略的通知机制
2.只有真正例外的情况下才抛出异常,和断言类似,处理不可能发生的情况
3.不能用异常来推卸责任,能够在局部处理的,就不要抛出来
4.避免在构造和析构函数中抛出异常
5.在恰当的抽象层次抛出异常,把抛出的异常认为是接口的一部分,要符合接口的抽象,抛出的异常不能破坏封装,不能破坏抽象
6.在异常消息中加入关于导致异常发生的全部信息
7.避免是空的catch语句
8.了解所有的函数库抛出的异常
9.建议考虑一个集中的异常报告机制
10.在项目中对异常的使用标准化
11.考虑异常的替代方案
隔离程序,让程序包容由错误造成的损害
设定安全边界,对穿越边界的数据进行检查,为接口设定安全边界
分开管理,让大部分代码无需承担检查数据的责任
用类的层次,假如类的私有方法数据是安全的,类的公有方法数据则是不安全的
采用正确输入的类型,将输入数据转化为适当的类型,断言检查程序的错误,并不是数据错误。
隔栏的使用体现了架构层次上如何处理错误,隔栏内部使用断言,隔栏使用的是错误处理错误
用辅助代码来辅助调试程序,尽早引入辅助调试的代码,包括对通道的检查,通道状况的检查,资源使用情况等等;采用进攻式编程:在开发时让他显现出来,在运行时,让他能够自我恢复,之后计划移除辅助调试代码
怎么确定在代码中保存多少防御式代码
1.保留检查重要错误的代码
2.去除检查细微错误的代码和可以导致程序硬性崩溃的代码,保留可以稳妥的崩溃的代码
3.为技术支持人员记录错误的信息,并确保代码中的错误信息是友好的
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
· AI 智能体引爆开源社区「GitHub 热点速览」