大家好,我是渔夫子。今天从应用场景的角度来聊聊我对error的理解。
原文链接:https://mp.weixin.qq.com/s/ncEemMJ0kQayVPJrnF9aew
01 什么是Error
在Go中,error是一种内建的数据类型。在Go中被定义为一个接口,定义如下:
// The error built-in interface type is the conventional interface for
// representing an error condition, with the nil value representing no error.
type error interface {
Error() string
}
由此可知,该接口只有一个返回字符串的Error函数,所有的类型只要实现了该函数,就创建了一个错误类型。
02 创建error的方式
创建error的方式包括errors.New、fmt.Errorf、自定义实现了error接口的类型等。
2.1 通过errors.New方法创建
通过该方法创建的错误一般是可预知的错误。简单来说就是调用者通过该错误信息就能明确的知道哪里出错了,而不需要再额外的添加其他上下文信息,我们在下面的示例中详细说明。
err := errors.New("this is error")
我们看New方法的实现可知,实际上是返回了一个errorString结构体,该结构体包含了一个字符串属性,并实现了Error方法。代码如下:
func New(text string) error {
return &errorString{text}
}
// errorString is a trivial implementation of error.
type errorString struct {
s string
}
func (e *errorString) Error() string {
return e.s
}
error.New使用场景1:
通过errors.New函数创建局部变量或匿名变量,且不在调用函数中进行值或类型判断的处理,只打印或记录错误日志的场景。
使用示例1:
以下代码节选自源码/src/net/http/request.go中解析PostForm的部分。
当请求中的Body为nil时,返回的错误信息是"missing form body"。该信息已明确的说明错误是因为请求体为空造成的,所以不需要再额外的添加其他上下文信息。
func parsePostForm(r *Request) (vs url.Values, err error) {
if r.Body == nil {
err = errors.New("missing form body")
return
}
ct := r.Header.Get("Content-Type")
// 省略了后续的代码...
return
}
使用示例2
以下代码选择源码/src/net/http/transport.go的部分,当请求体中的url地址为nil返回的错误:“http: nil Request.URL” ,说明是请求中的URL字段为nil。以及当H