第八章,防御式编程前言Byzly。 防御式驾驶:你永远不能确定另外一位司机将要做什么。你要承担其保护自己的责任,哪怕是其他司机犯的错误。 防御式编程的主要思想:子程序应该不因传入错误数据而被破坏,哪怕是有其他子程序产生的错误数据。
8.1 保护数据免受非法数据的破坏1、检查所有来源于子程序外部的数据的值。 2、检查所有输入参数的值。 3、决定如何处理错误。
8.2 断言断言是指在开发期间使用的、让程序在运行时进行自检的代码。断言只在开发和维护阶段使用。 建立自己的断言。 使用断言的建议: 1、 用错误处理代码来处理预期会发生的状况,用断言来处理绝对不应该发生的状况。断言是用来检查用于不该发生的情况,而错误处理代码是用来检查不太可能经常发生的非正常情况,这些情况在写代码的时候就可以预料到的,且产品代码中也要处理这种情况。断言用来检查程序中的bug,如果断言触发,则肯定是程序中存在bug。错误处理代码对反常情况做成反映。可以把断言看成主动的可执行的注释。错误处理代码处理系统外部的异常数据。如果数据来自可信的内部,则可以使用断言来检查。 2、 避免把需要执行的代码放入断言中。 3、 用断言来注释并验证前条件和后条件。前条件调用方代码在调用子程序或类之前要保证的条件;后条件是指被调用方代码执行结束后要保证的条件。可以用断言来检查前条件和后条件。 4、 对于高健壮性的代码,应该先使用断言再处理错误。同时使用两者。
8.3 错误处理技术断言用于处理代码中不应该出现的错误。错误处理技术对反常情况做出响应。 1、 返回中立值 2、 换用下一个正确的数据。 3、 返回与前次相同的数据。 4、 换用最接近的合法值。 5、 把警告信息记录日志中。 6、 返回一个错误码。 7、 调用错误处理子程序或对象。
健壮性与正确性: 正确性意味着永远不返回不准确的结果。健壮性意味着要不断尝试采取某些措施,以保证软件能够持续的运行下去。我们的软件更倾向于健壮性。
高层次设计对错误处理方式的影响: 在软件架构的时候,就要设计一个统一的错误处理决策。一般情况下,函数返回错误,而调用者则要根据返回值进行处理。 防御式编程的全部的重点就在于防御那些你未曾预料到的错误。
8.4 异常
1、 用异常通知程序的其他部分,发送了不可忽略的错误。异常有一种无法被忽略的通知机制。 2、 只有真正例外的情况下才抛出异常。和断言类似,处理不可能发生的情况。 3、 不能用异常来推卸责任。应该在局部处理的,不要抛出来。 4、 避免在构造和析构函数中抛出异常。 5、 在恰当的抽象层次抛出异常。把抛出的异常认为是接口的一部分。要符合接口的抽象。抛出的异常不能破坏封装,不能破坏抽象,暴露细节。 6、 在异常消息中加入关于导致异常发生的全部信息。 7、 避免是空的catch语句。 8、 了解所有的函数库抛出的异常。 9、 考虑建立一个集中的异常报告机制。 10、 把项目中对异常的使用标准化。 11、 考虑异常的替代方案。
8.5 隔离程序,使之包容有错误造成的损害将某些接口设定为安全边界,对穿越边界的数据进行安全的检查。 让软件的某些部分处理“不干净的”数据,让另外一部分处理干净的数据,即可让大部分的代码无须在承担检查数据的责任。 在类的层次采用此方法:类的公用方法假定数据是不安全的,私用方法假定数据是安全的。 将输入数据转化为适当的类型。 隔栏使用的是错误处理错误,处理错误的数据。隔栏内部则使用断言,检查程序错误,而非数据错误。 隔栏的使用体现了架构层次上如何处理错误。
8.6 辅助调试的代码用辅助代码来辅助调试程序。 尽早引入辅助调试的代码,包括对通道检查,通道状态检查。资源使用情况等。
采用进攻式编程:在开发节点让他显现出来,而在产品运行时,让它能够自我恢复。 1、 确保断言能使程序终止运行。 2、 完全填充分配到的所有错误。 3、 完全填充分配到的所有的文件或流。 4、 确保每一个case语句中的default分支或else分支都能产生严重的错误。 5、 在删除一个对象前把它填满垃圾数据。
计划移除辅助调试代码: 1、 使用ant或make工具。 2、 使用内置的与处理器。 3、 编写自己的预处理器。 4、 使用调试存根。
8.7 确定在代码中保存多少防御式代码1、 保留那些检查重要错误的代码。 2、 去掉检查细微错误的代码 3、 去掉可以导致程序硬性崩溃的代码。 4、 保留可以稳妥的崩溃的代码。 5、 为你的技术支持人员记录错误信息。 6、 确保代码中的错误信息是友好的。
本章要点1、 最终产品代码对错误的处理比“垃圾进,垃圾出”要复杂的多。 2、 防御式编程技术可以让错误更容易发现,更容易修改,并减少错误对产品代码的破坏。 3、 断言可以帮助人尽早的发现错误,尤其是在大型系统和高可靠性的系统中。
|
《代码大全》学习笔记 第八章,防御式编程
最新推荐文章于 2024-09-13 23:14:05 发布