V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  rower  ›  全部回复第 1 页 / 共 2 页
回复总数  28
1  2  
22 小时 36 分钟前
回复了 dzdh 创建的主题 Go 编程语言 go 没有异常 怎么判断逻辑以外的错误 全局的处理
1.有处理错误的中间件,有处理 panic 的中间件,这两个是不一样的

2.这里是错误类型,我们走处理错误的中间件

3.你想返回的 http 状态码是 500 ,同时错误信息是 db no ....

却被 401 处理了

对于这种情况是创建自定义错误类型,参考

https://github.com/ardanlabs/service6-video/tree/main/app/api/errs

```
// Error represents an error in the system.
type Error struct {
Code ErrCode `json:"code"`
Message string `json:"message"`
}
```

这里的 message 就是我们的错误信息`db no ...`

这里的 code 是我们内部错误的编码,比如说授权错误,code = 1 ,数据库错误,code = 2

参考 code 设计

https://github.com/ardanlabs/service6-video/blob/main/app/api/errs/codes.go

4.如何将 不同的错误转换为对应的 http 状态码,需要建立 code 和 http 状态码的 map 关系

参考

https://github.com/ardanlabs/service6-video/blob/main/api/http/api/mid/errors.go

5.错误中间件处理错误

这里处理错误时,如果是我们自定义的错误,就将 code 转换为对应的 http 状态码,错误信息不变。

如果不是自定义错误,表明是未知错误,返回 {500,unknow err}

参考 https://github.com/ardanlabs/service6-video/blob/main/app/api/mid/errors.go

```
func Errors(ctx context.Context, log *logger.Logger, handler Handler) error {
err := handler(ctx)
if err == nil {
return nil
}

log.Error(ctx, "message", "ERROR", err.Error())

// 这里判断是不是自定义错误
if errs.IsError(err) {
return errs.GetError(err)
}

return errs.Newf(errs.Unknown, errs.Unknown.String())
}
```
19 天前
回复了 aababc 创建的主题 程序员 golang 中 error 如何影响 log 和 api 状态
第二点,就是首先需要有自己的自定义错误类型,参考
https://github.com/ardanlabs/service6-video/tree/main/app/api/errs
然后每种错误对应的 http 状态码
参考
https://github.com/ardanlabs/service6-video/blob/main/api/http/api/mid/errors.go
的 init() 函数

最后在 Error 的中间件中对错误进行判断,如果是自定义错误,返回错误和对应的状态码,如果不是,返回 500
19 天前
回复了 aababc 创建的主题 程序员 golang 中 error 如何影响 log 和 api 状态
第一个对于 web 的错误,比较好的做法是创建一个 Error 的中间件统一处理,在 gin 中,我的用法如下

func CreateUser(mobile string) (*User) {
exists, err := mobileExists(mobile)
if err != nil {
// 这个 c 是 gin 的 context ,一般 mobile 这个请求参数是从 c 获得的,这里忽略那些细节,记录错误就是 c.Error()
c.Error(err)
return nil
}
if exists {
c.Error(err)
return nil
}
// ...
}
// 中间件处理错误
func Errors(log *logger.Logger) gin.HandlerFunc {
return func(c *gin.Context) {

ctx := c.Request.Context()


if len(c.Errors) > 0 {
// 处理第一个错误
// 在 gin 中,错误是一个数组,这里只处理第一个错误,一般来说我们在程序中遇到错误时,只会返回一个错误
// 如果出现了例外情况,那么我们需要修改这里的代码
err := c.Errors[0].Err
// 记录错误
log.Error(ctx, "message", "ERROR", err.Error())
}


}
347 天前
回复了 Hmmmmmmm 创建的主题 生活 求推荐,买箱酒孝敬老爹
先搞清楚你爸喜欢什么口味的酒,有酱香酒,茅台之类的,有浓香型的酒,五粮液,剑南春,海之蓝,有清香型的,青花汾 20 。选的味不对,再贵也没用。
350 天前
回复了 yinwenjian 创建的主题 生活 关于为什么总觉得时间过的飞快
有点东西,兄弟
@harry890829 ok ,这个我知道了,源码在新的镜像中,便于分发
@morenacl 没毛病
2023-11-21 10:06:27 +08:00
回复了 rower 创建的主题 开源软件 我发现谷歌,微软, FB 等这些大公司是不用一些开源软件的
@forvvvv123 有些道理
@rsy
好的,这两个感觉可以
@forvvvv123
@terrysnake
@hokori
mac 的话感觉是不是一些软件不兼容
2022-09-16 16:43:48 +08:00
回复了 aw2350 创建的主题 问与答 十月准备出去面后端了,求面经
github 搜索:go interview 或者 go 面试
2022-08-25 17:20:22 +08:00
回复了 rower 创建的主题 问与答 国外网站买了一个课,怎么支付,求救
2022-07-12 16:24:47 +08:00
回复了 unt 创建的主题 问与答 请问 tg 上有哪些安全风险,我是 macos+ios
纸飞机情报系统
https://2047.one/t/17419
2022-06-30 11:17:37 +08:00
回复了 rower 创建的主题 问与答 mysql 事务的处理,想问下这种情况下需要使用事务吗
@yuancoder
@hidemyself
为啥呢
2022-06-08 13:21:17 +08:00
回复了 hjue 创建的主题 分享发现 昨天 typora 还可以正常使用,今天就不让用了
重新下个安装包,重新安装下就行了
2022-05-05 16:30:00 +08:00
回复了 dtgxx 创建的主题 问与答 clickhouse 分布式表问题请教
查询的时候不是查询分布式表吗,分布式表将查询分发到每个本地表,然后查询结果汇总,不是很明白。这个怎么可能查询不到数据,再者说你自己测试下不就知道了
2022-04-27 08:36:32 +08:00
回复了 XiaoGouBa 创建的主题 问与答 上网行为管理软件能看到微信聊天记录吗?
2022-04-27 08:34:51 +08:00
回复了 XiaoGouBa 创建的主题 问与答 上网行为管理软件能看到微信聊天记录吗?
2022-04-26 13:53:03 +08:00
回复了 XiaoGouBa 创建的主题 问与答 上网行为管理软件能看到微信聊天记录吗?
没有反馈。比如你要做一个网站的后台,先做一个登录功能,你自己就会去想怎么做,然后做出来之后,页面调试一下,WC 登录成功了,有那种收获感。然后现在你学编程是今天学习 ArrayList ,学习了 ArrayList 的添加,遍历,删除,修改,纯纯的代码,最多输出下 List 里面每个元素的内容,没啥成就感。建议写笔记或者博客记录下学习的内容,有一个整体结构的梳理。第二个加快基础知识的学习,赶快写项目,写个博客之类的项目也行,在实际项目中学习掌握的很快。
然后就是这种学习枯燥很正常。
1  2  
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2852 人在线   最高记录 6679   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 29ms · UTC 13:26 · PVG 21:26 · LAX 05:26 · JFK 08:26
Developed with CodeLauncher
♥ Do have faith in what you're doing.