1 回答

TA贡献1951条经验 获得超3个赞
Go 提出了一种不同的方法,错误不是例外,它们是正常事件,只是不太常见。
以上面的代码为例:
body, err := ioutil.ReadAll(io.LimitReader(r.Body, 1048576))
if err != nil {
panic(err)
}
在这里,恐慌(没有恢复)终止了进程,关闭了 Web 服务器。似乎对没有完全阅读请求的反应过于严厉。
你想让我做什么?告诉提出请求的客户可能是合适的:
body, err := ioutil.ReadAll(io.LimitReader(r.Body, 1048576))
if err != nil {
http.Error(w, err.Error(), http.StatusBadRequest)
return
}
您可能希望返回一个 json 编码的响应,或者向客户端提供通用消息以避免暴露太多,并记录特定的错误详细信息。
对于一般函数,将错误作为最后一个返回参数返回是惯用的。在你提到的具体例子中:
func HandleCustomerLocationChange(custLoc CustomerLocation)
...
conn, err := amqp.Dial(...)
failOnError(err, "Failed to connect to RabbitMQ")
相反,检查连接是否失败,并将错误返回给调用者。在调用函数中处理它,或添加信息并将其向上传播到调用堆栈。
func HandleCustomerLocationChange(custLoc CustomerLocation) error
...
conn, err := amqp.Dial(...)
if err != nil {
return fmt.Errorf("failed to connect to RabbitMQ: %s", err)
}
以这种方式传播错误给出了根本原因的简明解释,例如5 个为什么技术,例如:
“没有更新客户端位置:没有连接到rabbitmq:网络地址1.2.3无法访问”
另一个约定是先处理错误并尽早返回。这有助于减少嵌套。
- 1 回答
- 0 关注
- 164 浏览
添加回答
举报