Лучший способ справиться с ошибкой от записи вызова в Go http обработчик - PullRequest
2 голосов
/ 14 марта 2019

Как лучше всего обработать ошибку Write в обработчике http.

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

Я полагаю, что могу взять n и попробовать снова записать с оставшимися байтами.

1 Ответ

0 голосов
/ 27 июня 2019

На данный момент вы увидите только два типа ошибок:

  • сетевых ошибок, ( например , если клиент уходит, когда вы пытаетесь отправить данные), или

  • ошибок, вызванных ошибками на вашем сервере ( например , если вы вручную установите Content-Length, а затем попытаетесь записать больше данных, чем заявили, вы получите ErrContentLength).

Вы можете посмотреть на реализацию класса response в net / http / server.go , чтобы получить представление об ошибках, которые вы можете увидеть по умолчанию ResponseWriter. Как справиться с этими ошибками?

  • Для таких ошибок, как ErrContentLength, которые указывают на ошибки на сервере, логично зарегистрировать их, поскольку сообщения об ошибках могут помочь исправить сервер.

  • Мне кажется разумным просто игнорировать сетевые ошибки, но, конечно, они также могут регистрироваться, если это необходимо.

  • Первое, что делает Write(), это убедиться, что заголовки отправлены. Таким образом, к тому времени, когда вы увидите код ошибки, возвращаемый Write(), будет слишком поздно пытаться изменить код состояния HTTP. Учитывая это, кажется, не стоит пытаться (и, вероятно, невозможно) уведомить клиента о том, что что-то пошло не так.

...