如何进行错误处理,这是一个Go程序员之间,特别是一些新的Go程序员,会经常讨论的问题.讨论到最后往往由于以下代码的多次出现而变成了抱怨.
if err != nil { return err }
我们最近扫描了我们能找到的开源项目,这段代码只在一页或者两页中出现了一次,是不是比你想象的少很多.然而,必须到处写 if err != nuil
的感觉依然存在 , 那一定是哪里出了问题,而且明显问题出在Go自己身上.
不幸的是,这是一个误解,而且很容易纠正.或许一个新的Go程序员想问 “怎么会只有一个错误处理?”,那么学习这种模式,保持它.在其它语言中可以使用try-catch或者其他类似机制去处理错误.因此程序员认为,当我需要在其他语言中使用try-catch的时候,我只需要在Go写if err != nil
,随着时间的推移Go代码里会出现很多这样的代码片段,结果感觉很笨拙.
不管这个解释是否符合,很显然这些Go程序员忘记了一个关于错误的基本观点:错误也是值.
值可以被编程,因此错误也是值,错误也可以被编程
Values can be programmed, and since errors are values, errors can be programmed.
当然一个常用的涉及到错误值的语句是测试它是不是nil
, 但是也有无数的其他事情可以用错误值来做.使用一些其他事情可以让你更好的编程,可以很大程度排除使用if语句检查错误的固定模式.
这是一个简单的示例,来自bufio 包的Scanner类型.它的 Scan方法执行底层的I/O操作,显然它可能引起一个错误.然而Scan方法并不会暴露错误.他返回一个布尔值,通过在Scan运行之后执行的另一个方法来报告是否发生了错误.调用代码如下: