第四章注重实效的偏执
这一章的主题是如何编写防御性的代码,以应对可能出现的错误和异常。作者提出了以下几个策略:
按合约设计:用文档记录并约定软件模块的权利和责任,以确保程序的正确性。合约包括前置条件、后置条件和类不变式,分别表示调用者和被调用者在执行前后必须满足的条件,以及类在任何时候都应该保持的状态。合约可以用断言、语言特性或注释来实现,也可以用异常机制来处理违反合约的情况。按合约设计可以提高代码的可读性、可维护性和可测试性,也可以避免一些逻辑错误和资源泄漏12。
死程序不说谎:当发现不可能发生的事情时,要让程序尽快崩溃,而不是继续运行并造成更大的损害。要检查每一个可能出错的地方,特别是意料之外的错误,并使用异常或其他方式来终止程序。要在崩溃前释放资源,并提供有用的调试信息。死程序不说谎可以帮助快速发现和定位问题,也可以避免数据损坏或系统崩溃34。
断言式编程:使用断言来检查决不应该发生的事情,以及一些重要的假设和逻辑。断言不应该有副作用,也不应该替代正常的错误处理。断言可以帮助发现和定位错误,也可以作为代码的文档。尽量保持断言开着,除非有性能问题5 。
何时使用异常:使用异常来处理意外事件,而不是正常流程的一部分。异常可以简化错误处理逻辑,也可以跨越多个调用层次。要注意异常的类型、信息和处理方式,以及异常与资源配平的关系 。
怎样配平资源:要确保分配和释放资源是成对出现的,避免内存泄漏或死锁等问题。要按照相反的顺序释放资源,也要保持一致的顺序分配资源。要考虑使用构造函数和析构函数来自动管理资源,或者使用其他语言特性或工具来辅助 。