第二十二节:死程序不说谎
对待程序我们通常会有“它不会发生”的心理状态,这会导致我们忽视一些问题。对于注重实效的程序员来说,如果我们忽略了一个错误,将是非常糟糕的事情。
对于程序员来说,崩溃往往比破坏更容易让人接受。当代码发生认为不可能的事情时,那么系统已经崩溃了。
正确认识死程序,死程序的危害比有问题的程序危害要小。
第二十三节:断言式编程
如果它不可能发生,用断言确保它不会发生。
使用断言进行代码的检查,排除错误,但传入断言的代码不应该有附条件;但不能使用断言代替错误处理。
让断言开着:检查你任何疏漏的错误
第二十四节:何时使用异常
异常很少应作为程序的正常流程的一部分使用,异常应该保留给意外情况。如果移除了所有的异常处理器,代码就无法运行,那说明异常正在被用于非异常情况中。
是否应该使用异常取决于实际情况。比如打开文件,文件不存在,是否应该发生异常?如果文件应该在那里,那么异常就有正当理由。如果不确定文件是否在那里,返回错误就可以了。
第二十五节:怎样配平资源
对于资源的分配:要有始有终。使用资源,分配资源,解除占用。
对于资源的占用有始有终,但在一些语言中可以扩展这个概念。对资源进行嵌套分配:①以与资源分配相反的次序解除资源占用;②在不同地方分配同一资源时,以相同的次序进行分配,降低死锁的可能性。
异常的配平需要避免违反 DRY 原则。例如文件打开的异常情况,会导致 try..catch 有两条路径,那如何避免在正常流程和 catch 流程都处理 error 情况呢?C++ 可以依赖对象自动析构的特性,Java 可以依赖 finally子句。
无法配平资源时,为内存设立语义不变项,接触顶层结构,可在动态分配的对象上实现可计数方案。