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,不用擔心,程式會記一個日誌,而不是以掛掛告終了。