Go中应该抛出哪些错误?

Go中应该抛出哪些错误?,go,error-handling,Go,Error Handling,因为我来自python,所以我知道抛出异常或一般错误处理 现在,我在go中编写了以下代码: func AddHeadersheaders映射[string]字符串,请求*http.request*http.request,错误{ 对于键,值:=范围标头{ request.Header.Setkey,值 } 返回请求,无 } 这应该是可行的,但如果标题集失败,我可能会抛出一个错误,比如: request.Header.Set(key, value) header := request.Header

因为我来自python,所以我知道抛出异常或一般错误处理

现在,我在go中编写了以下代码:

func AddHeadersheaders映射[string]字符串,请求*http.request*http.request,错误{ 对于键,值:=范围标头{ request.Header.Setkey,值 } 返回请求,无 } 这应该是可行的,但如果标题集失败,我可能会抛出一个错误,比如:

request.Header.Set(key, value)
header := request.Header.Get(key)
if header != value {
    return nil, errors.New("failed to add header")
}
因为我也尝试对我的大部分代码进行单元测试,所以我认识到触发这个错误几乎是不可能的,所以我问自己抛出这个错误是好是坏

Go中应该抛出哪些错误

没有。Go甚至没有抛出错误的能力

在Go中,错误是正常值,因此作为正常值返回

在您的代码示例中,您需要/希望返回错误的唯一原因是,添加头可能会导致错误。如果出现重复的标头,您可能希望返回错误,例如:

func AddHeadersheaders映射[string]字符串,请求*http.request*http.request,错误{ 对于键,值:=范围标头{ 如果request.Header.Getkey!={ 返回nil,fmt.ErrorfHeader键%s已设置,键 } request.Header.Setkey,值 } 返回请求,无 } 但老实说,这可能没有道理。因此,您可以完全从返回列表中删除错误值:

func AddHeadersheaders映射[string]字符串,请求*http.request*http.request{ 对于键,值:=范围标头{ request.Header.Setkey,值 } 退货申请 } 在这个特定的示例中,您也不需要返回请求。您可以就地修改它:

func AddHeadersheaders映射[string]字符串,请求*http.request{ 对于键,值:=范围标头{ request.Header.Setkey,值 } }
Go不像其他一些编程语言那样具有throw或Rise。如果request.Header.Set可能失败,它应该自己返回一个错误。您不应该从外部执行此操作。只要有意义,您就应该返回错误,比如您正在写入文件或执行可能失败的操作。AddHeaders中的任何内容都不会返回错误,因此我看不到AddHeaders中有任何一点会返回错误。只要定义了错误并且在Go中可能出现错误,您就应该抛出错误,而不是抛出错误。文档并没有说函数可能会失败,毕竟它不会返回错误,所以如果它返回了错误,那么您正在使用的标准库的实现中就有一个bug。除非你有正当理由相信这样一个bug的存在,否则你不应该检查它们。如果你有这样一个合理的理由,你应该提交一份bug报告。我想说,如果某个东西返回错误,处理错误是一个好主意