在Go http处理程序中处理Write调用错误的最佳方法

时间:2019-03-13 22:24:20

标签: http go io handler

在http处理程序中处理Write错误的最佳方法是什么。

func hello(w http.ResponseWriter, r *http.Request) {
  n, err := w.Write([]byte("hi"))
  // how should we handle this error?
}

我想我可以取n并尝试用剩余的字节再次写。

1 个答案:

答案 0 :(得分:0)

目前,您只会看到两种类型的错误:

  • 网络错误,(例如,如果客户端在尝试发送数据时不见了),或者

  • 由服务器中的错误( eg )引起的
  • 错误(如果您手动设置Content-Length,然后尝试写入比您声称的更多的数据,则会得到ErrContentLength )。

您可以查看net/http/server.goresponse类的实现,以了解在默认ResponseWriter中可能看到的错误。 如何处理这些错误?

  • 对于ErrContentLength之类的错误指示服务器中的错误,将这些错误记录下来似乎是合理的,因为错误消息可能有助于修复服务器。

  • 在我看来,简单地忽略网络错误似乎很合理,但是如果需要,当然也可以记录这些错误。

  • Write()要做的第一件事是确保发送了标头。因此,当您看到Write()返回的错误代码时,尝试更改HTTP状态代码为时已晚。鉴于此,似乎不值得尝试(并且可能是不可能的)通知客户端出了点问题。