Golang error 的突围
目录
写过 C 的同学知道,C 语言中常常返回整数错误码(errno)来表示函数处理出错,通常用 -1
来表示错误,用 0
表示正确。
而在 Go 中,我们使用 error
类型来表示错误,不过它不再是一个整数类型,是一个接口类型:
type error interface { Error() string }
它表示那些能用一个字符串就能说清的错误。
我们最常用的就是 errors.New()
函数,非常简单:
// src/errors/errors.go func New(text string) error { return &errorString{text} } type errorString struct { s string } func (e *errorString) Error() string { return e.s }
使用 New 函数创建出来的 error 类型实际上是 errors 包里未导出的 errorString
类型,它包含唯一的一个字段 s
,并且实现了唯一的方法:Error() string
。
通常这就够了,它能反映当时“出错了”,但是有些时候我们需要更加具体的信息,例如:
func Sqrt(f float64) (float64, error) { if f < 0 { return 0, errors.New("math: square root of negative number") } // implementation }
当调用者发现出错的时候,只知道传入了一个负数进来,并不清楚到底传的是什么值。在 Go 里:
It is the error implementation's responsibility to summarize the context.
它要求返回这个错误的函数要给出具体的“上下文”信息,也就是说,在 Sqrt
函数里,要给出这个负数到底是什么。
所以,如果发现