在看《Go入门指南》的一种用闭包处理错误的模式时,里面提到了一种错误的优雅处理方式,减少我们重复写if err:=f(); err != nil{}
式的代码,感觉很心动,做了下测试,结论如下:
- 能减少
if err
式的代码,代码可以变清新整洁。 - 使用存在限制:只有当错误需要结束调用时才可以使用这种方法,如果被调用函数返回错误,但调用者函数需处理错误后,向下继续执行,则不能采用这种方法。
经常的写法
我们在设计函数时,错误处理要遵循以下2个规则:
- 被调用函数如果有错误,需要传递给调用者,一定要返回
- 调用者收到返回的错误,一定不可忽视,忽视就是埋bug。如果调用者不处理,被调函数就需要设计成无错误返回。
我们都有这种感受,一个函数需要调用许多函数,然后处理他们的错误,光if err
就写了一堆,比如下面的test()
函数。
package main
import (
"errors"
"log"
)
func main() {
test()
}
func test() {
if err := a(); err != nil {
log.Println(err)
}
if err := b(); err != nil {
log.Println(err)
}
if _, err := c(1, 0); err != nil {
log.Println(err)
}
if _, err := d(1, 0); err != nil {
log.Println(err)
}
}
func a() error {
return errors.New("error in a")
}
func b()