Игнорирование ошибок

Возник вопрос касательно закрытия тела для каждого 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 шт):

Автор решения: Pak Uula

Ваше утверждение, что в примерах не обрабатывают ошибки, не верно.

Вот пример из официальной документации

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.

→ Ссылка