go web: 4 处理默认错误

来源:互联网 发布:古墓丽影8mac配置要求 编辑:程序博客网 时间:2024/06/13 17:46

panic会导致程序崩溃

在go web中,难免会引发panic。比如用户在一次请求中输入了不正确的数据导致除0或者数组越界。如果不设置默认的错误处理,那程序就会崩溃退出,这显然是不能接受的。所以要实现一个默认的总错误处理。

代码

依前文,现在项目中已经有如下结构:

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

在go web: 3 中间件和路由中,我们实现了中间件。没错,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)}

现在我们尝试在test.SayHello这个handler中引发一个panic,不用担心,程序会记一个日志,而不是以挂挂告终了。

原创粉丝点击