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

2020-02-23 17:34:55 +08:00
 lcj2class

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

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

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

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

3946 次点击
所在节点    Go 编程语言
17 条回复
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
2020-02-23 18:39:28 +08:00
对。像楼上说的。需要 wrapper 一下。

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

这里有个统计的


@chenhui7373
@cabing
@labulaka521
wrap 的方式我目前也在用,关键在于只支持传递 string,没法传 http code 信息
lcj2class
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
2020-02-24 12:51:58 +08:00
嗯,其实思路都差不多的。自创解决方案我是做不到的,我一般都是翻别人代码,参考下别人怎么写
labulaka521
2020-02-24 15:08:01 +08:00
@lcj2class 我返回 code 是用的这种方式
自定义一个结构体 实现了 error 接口 最上层判断一下
lcj2class
2020-02-24 15:21:31 +08:00
https://gitee.com/liujiacai/codes/497gr52ehk0ajywxdfbp655

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

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

<script src="https://gist.github.com/jiacai2050/b7445647006237f5fbb27cc2494ad3b0.js"></script>

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/646861

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX