比如数据库服务吧。

程序启动,先连 db 。连成功。启动 web 服务。然后 setup 路由啥的一堆。

好,服务启动成功了。

现在接受 http 请求,此时数据库崩了。

gorm 返回了 err 。比如代码如下

// userRepository.go
func GetUser(uid int64) (*User, error) {
    user:=new(User)
    if err :=db.model(user).Find(user).err; err != nil {
        return nil,err
    } else { return user, nil }
}

按照 java/php 这种的逻辑。我可以抛出个异常。然后有个地方是处理这个特殊的异常。返回 500,db no connection 。

go 里边咋做呢?现在数据库崩了以后,被业务中间件拦截到了 返回 401 unauthorized 。

repository 由 http 服务调用。我要直接 panic 吗 0.0 http 的中间件 recover 住判断 err 是哪种错误? 这么粗暴的吗?

举报· 2266 次点击
登录 注册 站外分享
21 条回复  
voidmnwzp 小成 昨天 14:23
跟 java 一样向上抛啊
sduoduo233 小成 昨天 14:24
我一般是返回 500 ,然后记录一下错误 u,err:=GetUser(1) if err!=nil { w.WriteHeader(500) log.Println(err) return }
dzdh 楼主 小成 昨天 14:27
@voidmnwzp @sduoduo233 其实返回个 401 也没毛病。就是觉得怪怪的
laikick 小成 昨天 14:33
Panic + Recover + 自定义错误类型 就可以实现类似 Java 的操作 不过也仅仅是类似. 但是,这不是 go 推荐的. 别把 Java 的习惯带入 go 里面. 这两个语言的思想差别很大的. 你应该定义一个 ErrDBConnection. 然后在 http 服务 errors.Is(err, repository.ErrDBConnection).
kk2syc 初学 昨天 14:33
可以直接 panic ,可以用中间件捕获。不一定比全局优雅,但是也是不错的,业务上我都这样。 ---- func ExceptionMiddleware(c *gin.Context) { defer func() { if err := recover(); err != nil { c.JSON(500, gin.H{"msg": "ERROR"}) c.Abort() } }() c.Next() }
kingcanfish 小成 昨天 14:38
java 有个地方处理这个特殊异常,go 中间件不就是这个特殊的地方吗 我一般是自己定义一些 error 比如 db error, logic errr, client err, 在最先抛出 error 的地方包一层, 然后网上传 最终中间根据不同的 error 返回错误码 ,比如你这个例子, 发现 db 包 error 了 我就包一层 自己的 db error ,往上抛, 中间件捕获
dzdh 楼主 小成 昨天 14:43
@kingcanfish 抛就是 panic 呗?
realpg 小成 昨天 14:43
还是不建议这么跨舒适区干活 玩惯了 exception 那一套 改 go 推荐这一套 可能一年都改不过来 不如再找个 java 工作
kingcanfish 小成 昨天 14:47
@dzdh #7 error
123下一页
返回顶部