比如数据库服务吧。

程序启动,先连 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 是哪种错误? 这么粗暴的吗?

举报· 2271 次点击
登录 注册 站外分享
21 条回复  
lqs 初学 昨天 18:39
ctx 要一路带进去(适当的地方加上 WithTimeout / WithCancel 等) err 要一路带出来(适当的地方包裹一下加上错误提示和相关参数上下文)
leonshaw 小成 昨天 18:07
我一般只有断言失败才用 panic ,其它情况都是返回 error ,视情况包装一层。
guanzhangzhang 初学 昨天 18:03
返回 error ,上层处理和家 warp 信息,最后到你接口层面你可以返回 500
wangritian 小成 昨天 17:54
所有语言的最佳实践,都可以在流行框架内找到,推荐到 goframe 看看 go 一般是自己设计一个符合 error 接口(包含 Error 方法)的带 code 和 msg 的自定义 error 通过 recover 全局拦截异常,如果是底层报错(数据库连接失败等业务层无须接收),直接 panic 如果是业务异常(用户名重复),return 自定义 error
changz 初学 昨天 17:40
用 protobuf 定义错误码,一层一层往上抛
chevalier 小成 昨天 17:09
从功能上来说 Go 的 error 相当于 Java 的异常 Go 的 panic 相当于 Java 的 Error
zsj950618 小成 昨天 16:47
> 被业务中间件拦截到了 返回 401 unauthorized 那是这个中间件垃圾,都不看错误类型就一股脑返回 401 。
chen11 初学 昨天 16:46
我上周才遇见个 bug ,go 程序直接崩溃,log 没打出来,找不到 bug 在哪里。习惯了 java ,来写 go 就难受
Blackbelly 初学 昨天 16:21
直接 panic 因为数据库崩了属于 unrecoverable 的错误。这时候当成 err 向上抛没有意义,上一层也无法处理,只能层层往上抛。 而且,你的接口语义是 GetUser ,本身就不应该返回一个接口语义之外的错误。 按照接口语义,应该是返回一个 user ,或者是 NotFoundErr ,除此之外的错误都不应该返回。
123下一页
返回顶部