【问题标题】:Best way to handle error from Write call in Go http handler在 Go http 处理程序中处理 Write 调用错误的最佳方法
【发布时间】:2019-03-13 22:24:19
【问题描述】:

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

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

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

【问题讨论】:

  • @ThunderCat 我知道。我的问题是如果我不想忽略如何处理这个错误
  • 你可以记录它,返回一个http服务器错误,或者忽略它。什么是“最好的”取决于你。
  • @johlo:此时不太可能出现临时错误。通常有很多层缓冲来自实际网络连接的调用者。您更有可能看到ErrContentLengthErrBodyNotAllowedErrHijacked 等内容。
  • 好点,在大多数情况下尝试返回服务器错误可能是不可行的,或者即使这样做也值得。
  • 你能做的最好的就是记录错误。网络层的错误通常是因为数据无法发送到对等方。没有任何恢复。指示程序员错误的错误(ErrHijacked、ErrContentLength、...)需要代码修复。

标签: http go io handler


【解决方案1】:

此时你只会看到两种类型的错误:

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

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

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

  • 对于像 ErrContentLength 这样的错误,表明服务器中存在错误,记录这些似乎是合理的,因为错误消息可能有助于修复服务器。

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

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

【讨论】:

    猜你喜欢
    • 2010-10-11
    • 2011-08-13
    • 1970-01-01
    • 2014-09-10
    • 2017-09-13
    • 2016-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多