作为一个初学者,我的程序经常会出现或多或少的编译和运行上的错误,这本书关于处理不可避免的错误——代码中的错误情形给出了很详细的讨论。我很喜欢书上引用罗伯特 · 奥本海默的一句话“避免错误的唯一办法就是找出错误,而找出错误的唯一办法就是要有自己提出问题的权利。”
书中指出,错误可以归为用户错误、程序员错误和意外情况三类。用户错误主要体现在错误乃至荒谬的输入和操作。程序员错误主要体现在代码的bug,代码中一个地方的bug常常会导致更多的错误在代码中其他地方出现,所以要培养防御性编程的意识。而意外情况譬如网络连接失败,硬盘空间不足等虽然不常见,但也要纳入到我们编程的考虑范围之内。
要处理错误就要有一个错误报告机制。我有时候觉得一个函数比较简单甚至就直接定义为void类型,不判断它运行的正常与否,这种习惯是很不好的。当我判断函数是否正常运行时,我常用的方法是错误返回-1,正确返回1。但当我的函数要返回数据时,这种方法就不方便了。书中对于这种情况给出了三种方法:其一是返回一个复合数据类型(比较笨拙且不常用)。其二是通过一个函数参数返回错误代码(容易实现,但不美观也不直观)。最后是预留一些返回值表示故障(如要返回正数的数据,可用负数来表示出现的各种错误类型)。
而处理错误则需要搞清楚一些关键的问题,其中一些问题是以前我编程的时候经常忽略掉的。
其一,处理错误需要明白出现错误的问题的本质,发生错误时操作完成了多少对于搞清楚为什么出错是非常有用的。
其二,判断错误的严重性是有必要的。有一些严重错误是无法绕过的,需要优先处理,对错误分级处理可以有条理的解决问题,也不至于因为没有先解决严重错误而使程序多次崩溃而打击自己的积极性。最后,除了耐心读自己的代码,通过已有的其他信息来推断错误来源是十分有用的,可以通过编译器自带的窗口看一下出错时各个变量的值是否出错。这样可以使处理错误更加高效和准确。
最后,我们需要管理自己的错误,即要对故障的处理建立一个一般性的原则,一致的策略。在过去的编程中,我编程的目的就是为了解决作业中的问题—— 往往只能对于正确的输入给出正确结果,而对于错误输入的处理非常简单。我今后需要养成管理错误的意识。首先做到不拖延,及时编写错误处理代码。其次,要尽可能多的覆盖错误可能性。还要对功能类似的函数的错误处理方法有一个统一的总结,这样总结以后一段时间以后,写函数的时候就可以对容易出错的地方看的更加清晰,考虑错误情形可以更加全面,使我的代码能慢慢变得强健起来。