Игнорирование ошибок
Возник вопрос касательно закрытия тела для каждого HTTP-запроса, почему в официальной документации, как и в обычных примерах из книг не выполняется проверка ошибки при закрытии тела? Из-за того, что в случае такой ошибки, нет смысла как-то её логировать или в таком случае исправить её никак нельзя?
resp, err := http.Get("https://google.com")
if err != nil {
log.Println(err)
}
defer resp.Body.Close()
Часто подобное игнорирование встречается и при записи данных в ResponseWriter для функций-обработчиков, т.е. также выполняется без какой-либо проверки со стороны программиста.
func handler(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("hello"))
}
Поэтому возникает вопрос – как понять, в каких случаях возможно игнорировать ошибки, а в каких – нет? Ведь обработка ошибок в Go – это важная часть программы и подобное игнорирование как будто бы не следует философии языка в этом отношении.
Ответы (1 шт):
Ваше утверждение, что в примерах не обрабатывают ошибки, не верно.
Вот пример из официальной документации
func main() {
res, err := http.Get("http://www.google.com/robots.txt")
if err != nil {
log.Fatal(err)
}
body, err := io.ReadAll(res.Body)
res.Body.Close()
if res.StatusCode > 299 {
log.Fatalf("Response failed with status code: %d and\nbody: %s\n", res.StatusCode, body)
}
if err != nil {
log.Fatal(err)
}
fmt.Printf("%s", body)
}
В случае ошибок здесь вызывают log.Fatal. Это почти как panic, только печатает дополнительные сведения. То есть в примерах просто убивают программу, если что-то пошло не так
В общем же случае ошибки нужно обрабатывать всегда и как минимум выводить их в лог. Ну и разумеется никогда не связываться с возвращаемым значением, если ошибка не nil.