根据上面的统计,gin 貌似是最多的,不知道实际情况如何。
另一个问题是怎么在 handler 中处理 err,知乎用的是 panic/recover 的方式,这样肯定是不符合 go 的惯用法,但是思路是对的,在统一的地方处理 err,网上搜索了下,正确的思路应该是自定义 handler type
type appHandler func( http.ResponseWriter, *http.Request) *appError
这里想问下,大家是怎么处理 handler 中 error 的。
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 包一下,方便查看,普通的错误像参数不符合要求的,就直接返回错误信息就可以了 |
2
cabing 2020-02-23 18:39:28 +08:00
对。像楼上说的。需要 wrapper 一下。
我现在是 wapper 和 log.error 日志结合的。需要收集处理下。 |
3
lidashuang 2020-02-23 20:57:37 +08:00
发到 sentry 上
|
4
labulaka521 2020-02-23 21:39:42 +08:00 via Android
@lvsshuttao +1 我用的用 pkg/errors 这个包
|
5
chenhui7373 2020-02-24 07:23:55 +08:00 via Android
@lvsshuttao 实际上和 xerror 差不多,效果保留异常追溯。
|
6
chenhui7373 2020-02-24 07:26:12 +08:00 via Android
推荐 goframe,理由你要 go 的框架。
|
7
lcj2class OP https://www.jetbrains.com/lp/devecosystem-2019/go/
这里有个统计的 @chenhui7373 @cabing @labulaka521 wrap 的方式我目前也在用,关键在于只支持传递 string,没法传 http code 信息 |
8
lcj2class OP @lvsshuttao #1 看了下 goframe 的处理方式,也是用 panic/recover 来做的呀,
``` // Exit exits executing of current HTTP handler. func (r *Request) Exit() { panic(gEXCEPTION_EXIT) } ``` |
9
lvsshuttao 2020-02-24 12:51:58 +08:00
嗯,其实思路都差不多的。自创解决方案我是做不到的,我一般都是翻别人代码,参考下别人怎么写
|
10
labulaka521 2020-02-24 15:08:01 +08:00 via Android
@lcj2class 我返回 code 是用的这种方式
自定义一个结构体 实现了 error 接口 最上层判断一下 |
11
lcj2class OP https://gitee.com/liujiacai/codes/497gr52ehk0ajywxdfbp655
@lvsshuttao @labulaka521 我这里写了个简单的 demo,你们看看这样方式是不是更优雅一些?有类似这种做法的框架吗? |
12
woniuge 2020-02-24 21:10:52 +08:00
|
13
Comdex 2020-02-25 01:37:08 +08:00 via iPhone
@chenhui7373 goframe 相比 gin 性能怎样?
|
14
chenhui7373 2020-02-25 20:13:03 +08:00
|
15
Comdex 2020-02-25 22:44:08 +08:00 via iPhone
@chenhui7373 gin 应该是核心功能少,主要依赖各种周边的中间件...
|
16
lvsshuttao 2020-02-26 00:12:27 +08:00
@lcj2class 你地址,我打开来是 404
|
17
lcj2class OP @lvsshuttao gitee 有 bug 呀,明明我已经设置 public 了,移步 github gist 吧
<script src="https://gist.github.com/jiacai2050/b7445647006237f5fbb27cc2494ad3b0.js"></script> |