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,不用担心,程序会记一个日志,而不是以挂挂告终了。