7.10. 错误处理

在我们的程序中,有几个地方的错误被忽略了。这是一种很糟糕的方式,特别是在错误发生后,程序会崩溃。更好的方案是处理错误并返回错误消息给用户。这样做,当错误发生后,服务器可以继续运行,用户也会得到通知。

首先,我们处理renderTemplate中的错误:

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

函数http.Error发送一个特定的HTTP响应码(在这里表示“Internal Server Error”)和错误消息。

现在,让我们修复saveHandler:

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

p.save()中发生的任何错误都将报告给用户。