go web: 4 處理默認錯誤

  • 2019 年 11 月 21 日
  • 筆記

panic會導致程式崩潰

在go web中,難免會引發panic。比如用戶在一次請求中輸入了不正確的數據導致除0或者數組越界。如果不設置默認的錯誤處理,那程式就會崩潰退出,這顯然是不能接受的。所以要實現一個默認的總錯誤處理。

程式碼

依前文,現在項目中已經有如下結構:

src--|       handlers--|                 test--|                       test.go       logger--|               logger.go       |       main.go

在前篇文章中,我們實現了中間件。沒錯,handler默認的錯誤,我們就要從這個總入口入手: 把中間件處理改成:

// myHost 做中間件和Handler全局錯誤使用。免得一個panic把全局掛掛  func myHost(handler http.Handler) http.Handler {      ourFunc := func(w http.ResponseWriter, r *http.Request) {          var err error          defer func() {              rec := recover()              if rec != nil {                  switch t := rec.(type) {                  case string:                      err = errors.New(t)                  case error:                      err = t                  default:                      err = errors.New("Unknown error")                  }                  http.Error(w, err.Error(), http.StatusInternalServerError)                  logger.Errorln(                      fmt.Sprintf("%s %s n %s", r.Method, r.URL, err.Error()))              }          }()          //記錄時間          start := time.Now()          handler.ServeHTTP(w, r)          logger.Infoln(              fmt.Sprintf("%s %s %s", r.Method, r.URL, time.Now().Sub(start)))        }      return http.HandlerFunc(ourFunc)  }

現在我們嘗試在SayHello這個handler中引發一個panic,不用擔心,程式會記一個日誌,而不是以掛掛告終了。