вторник, 5 февраля 2019 г.

Веб-приложение на Go: обработка ошибок

В нашей программе есть несколько мест, где ошибки игнорируются. Это плохая практика, не в последнюю очередь потому, что, когда ошибка происходит, программа будет иметь непреднамеренное поведение. Лучшее решение - обработать ошибки и вернуть сообщение об ошибке пользователю. Таким образом, если что-то пойдет не так, сервер будет функционировать именно так, как мы хотим, и пользователь может быть уведомлен.

Сначала давайте обработаем ошибки в renderTemplate:

func renderTemplate(w http.ResponseWriter, 
                    tmpl string, p *Page) {
    t, err := template.ParseFiles(tmpl + ".html")
    if err != nil {
        http.Error(w, err.Error(), 
                   http.StatusInternalServerError)
        return
    }
    err = t.Execute(w, p)
    if err != nil {
        http.Error(w, err.Error(), 
                   http.StatusInternalServerError)
    }
}

Функция http.Error отправляет указанный код HTTP ответа (в данном случае "Internal Server Error") и сообщение об ошибке. Решение о том, чтобы поместить обработку шаблонов в отдельную функцию, уже окупается.

Теперь давайте исправим saveHandler:

func saveHandler(w http.ResponseWriter, r *http.Request) {
    title := r.URL.Path[len("/save/"):]
    body := r.FormValue("body")
    p := &Page{Title: title, Body: []byte(body)}
    err := p.save()
    if err != nil {
        http.Error(w, err.Error(), 
                   http.StatusInternalServerError)
        return
    }
    http.Redirect(w, r, "/view/"+title, http.StatusFound)
}

О любых ошибках, возникающих во время p.save(), будет сообщено пользователю.


Читайте также:


Комментариев нет:

Отправить комментарий