V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
lcj2class
V2EX  ›  Go 编程语言

大家项目中用的是什么 web 框架以及怎么处理 handler 中的 error?

  •  
  •   lcj2class · 2020-02-23 17:34:55 +08:00 · 4043 次点击
    这是一个创建于 1727 天前的主题,其中的信息可能已经有所发展或是发生改变。

    根据上面的统计,gin 貌似是最多的,不知道实际情况如何。

    另一个问题是怎么在 handler 中处理 err,知乎用的是 panic/recover 的方式,这样肯定是不符合 go 的惯用法,但是思路是对的,在统一的地方处理 err,网上搜索了下,正确的思路应该是自定义 handler type

    type appHandler func( http.ResponseWriter, *http.Request) *appError
    
    

    这里想问下,大家是怎么处理 handler 中 error 的。

    17 条回复    2020-03-04 10:06:36 +08:00
    lvsshuttao
        1
    lvsshuttao  
       2020-02-23 18:12:53 +08:00
    目前线上用的是 goframe,里面有个 gerror.wrap 之类的,我是这样使用的

    ```
    db 模型(业务最底层)
    => action 操作类 return gerror.Wrap(err, "自己看的 action 错误提示信息")
    => service 服务类 return gerror.Wrap( actionErr, "自己看的 service 错误提示信息")
    => controller 控制器 SmartResponseError( serviceErr, "返回给用户的错误提示信息")

    SmartResponseError(r *ghttp.Request, data ...interface{}){
    ....
    switch v := data[0].(type){
    case *gerror.Error:
    // 将 error 写入日志
    // 打印最后一个错误信息
    case error:
    // 普通错误,不需要写入日志,直接打印错误信息
    }
    }
    ```

    大概就是这样子,通常使用第三方库(如 xorm 等)错误的信息都会 wrap 包一下,方便查看,普通的错误像参数不符合要求的,就直接返回错误信息就可以了
    cabing
        2
    cabing  
       2020-02-23 18:39:28 +08:00
    对。像楼上说的。需要 wrapper 一下。

    我现在是 wapper 和 log.error 日志结合的。需要收集处理下。
    lidashuang
        3
    lidashuang  
       2020-02-23 20:57:37 +08:00
    发到 sentry 上
    labulaka521
        4
    labulaka521  
       2020-02-23 21:39:42 +08:00 via Android
    @lvsshuttao +1 我用的用 pkg/errors 这个包
    chenhui7373
        5
    chenhui7373  
       2020-02-24 07:23:55 +08:00 via Android
    @lvsshuttao 实际上和 xerror 差不多,效果保留异常追溯。
    chenhui7373
        6
    chenhui7373  
       2020-02-24 07:26:12 +08:00 via Android
    推荐 goframe,理由你要 go 的框架。
    lcj2class
        7
    lcj2class  
    OP
       2020-02-24 11:34:49 +08:00
    https://www.jetbrains.com/lp/devecosystem-2019/go/

    这里有个统计的


    @chenhui7373
    @cabing
    @labulaka521
    wrap 的方式我目前也在用,关键在于只支持传递 string,没法传 http code 信息
    lcj2class
        8
    lcj2class  
    OP
       2020-02-24 11:38:52 +08:00
    @lvsshuttao #1 看了下 goframe 的处理方式,也是用 panic/recover 来做的呀,

    ```
    // Exit exits executing of current HTTP handler.
    func (r *Request) Exit() {
    panic(gEXCEPTION_EXIT)
    }
    ```
    lvsshuttao
        9
    lvsshuttao  
       2020-02-24 12:51:58 +08:00
    嗯,其实思路都差不多的。自创解决方案我是做不到的,我一般都是翻别人代码,参考下别人怎么写
    labulaka521
        10
    labulaka521  
       2020-02-24 15:08:01 +08:00 via Android
    @lcj2class 我返回 code 是用的这种方式
    自定义一个结构体 实现了 error 接口 最上层判断一下
    lcj2class
        11
    lcj2class  
    OP
       2020-02-24 15:21:31 +08:00
    https://gitee.com/liujiacai/codes/497gr52ehk0ajywxdfbp655

    @lvsshuttao @labulaka521 我这里写了个简单的 demo,你们看看这样方式是不是更优雅一些?有类似这种做法的框架吗?
    woniuge
        12
    woniuge  
       2020-02-24 21:10:52 +08:00
    Comdex
        13
    Comdex  
       2020-02-25 01:37:08 +08:00 via iPhone
    @chenhui7373 goframe 相比 gin 性能怎样?
    chenhui7373
        14
    chenhui7373  
       2020-02-25 20:13:03 +08:00
    @Comdex gin 功能少呀,给 c 程序员够用,给正常 web 开发者不够,

    开箱即用不香吗? linus 都说我给你们做好了技术,你们只要考虑 profit。
    Comdex
        15
    Comdex  
       2020-02-25 22:44:08 +08:00 via iPhone
    @chenhui7373 gin 应该是核心功能少,主要依赖各种周边的中间件...
    lvsshuttao
        16
    lvsshuttao  
       2020-02-26 00:12:27 +08:00
    @lcj2class 你地址,我打开来是 404
    lcj2class
        17
    lcj2class  
    OP
       2020-03-04 10:06:36 +08:00
    @lvsshuttao gitee 有 bug 呀,明明我已经设置 public 了,移步 github gist 吧

    <script src="https://gist.github.com/jiacai2050/b7445647006237f5fbb27cc2494ad3b0.js"></script>
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   988 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 20:54 · PVG 04:54 · LAX 12:54 · JFK 15:54
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.