前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >go web: 4 处理默认错误

go web: 4 处理默认错误

作者头像
超级大猪
发布2019-11-21 20:30:53
4790
发布2019-11-21 20:30:53
举报
文章被收录于专栏:大猪的笔记

panic会导致程序崩溃

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

代码

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

代码语言:javascript
复制
src--|
     handlers--|
               test--|
                     test.go
     logger--|
             logger.go
     |
     main.go

在前篇文章中,我们实现了中间件。没错,handler默认的错误,我们就要从这个总入口入手: 把中间件处理改成:

代码语言:javascript
复制
// 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,不用担心,程序会记一个日志,而不是以挂挂告终了。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017-09-02 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • panic会导致程序崩溃
  • 代码
相关产品与服务
消息队列 TDMQ
消息队列 TDMQ (Tencent Distributed Message Queue)是腾讯基于 Apache Pulsar 自研的一个云原生消息中间件系列,其中包含兼容Pulsar、RabbitMQ、RocketMQ 等协议的消息队列子产品,得益于其底层计算与存储分离的架构,TDMQ 具备良好的弹性伸缩以及故障恢复能力。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档