为了账号安全,请及时绑定邮箱和手机立即绑定

Golang 惯用的错误处理

Golang 惯用的错误处理

Go
天涯尽头无女友 2021-07-17 18:15:01
我为独立和嵌入式使用(例如使用 CustomerRepository)创建了一个“基本”存储库结构,以避免一直检查错误,并为 Gorp(数据库工具包)创建一个抽象,并创建一个稍微多一点的 API我喜欢。我检查这个基本结构中的错误,如果发现错误,就恐慌,就好像我认为确实存在一个错误一样,它表明一个开发错误,代码也可能恐慌,认为验证等应该在数据到达存储库之前发生.我发现了这个问题Go Error Handling Techniques,但它没有像我所做的那样将错误包装在基本结构中并且只是恐慌。是我做的惯用 Go 吗?package repositoriesimport (    "github.com/coopernurse/gorp")type Repository struct {    Gorp gorp.SqlExecutor}func (r *Repository) GetById(i interface{}, id int) interface{} {    obj, err := r.Gorp.Get(i, id)    if err != nil {        panic(err)    }    return obj}func (r *Repository) Get(holder interface{}, query string, args ...interface{}) interface{} {    if err := Gorp.SelectOne(holder, query, args); err != nil {        panic(err)    }}func (r *Repository) Select(i interface{}, query string, args ...interface{}) {    if _, err := Gorp.Select(holder, query, args); err != nil {        panic(err)    }}func (r *Repository) Insert(list ...interface{}) {    if err := r.Gorp.Insert(list...); err != nil {        panic(err)    }}func (r *Repository) Update(list ...interface{}) int64 {    count, err := r.Gorp.Update(list...)    if err != nil {        panic(err)    }    return count}func (r *Repository) Delete(list ...interface{}) int64 {    count, err := r.Gorp.Delete(list...)    if err != nil {        panic(err)    }    return count}
查看完整描述

2 回答

?
三国纷争

TA贡献1804条经验 获得超7个赞

惯用的方法是返回具有关联类型值的错误,即

func (list ...interface{}) (v int46, err error) {}

...然后检查 err != nil 在哪里调用这些函数。

最终使用 panic() 将导致类似异常的错误处理和更多样板代码(如果您认为错误是可恢复的)。

Go 中的惯用错误处理是冗长的,但不如模拟异常(这基本上不是“Go 方式”)。


查看完整回答
反对 回复 2021-07-19
  • 2 回答
  • 0 关注
  • 204 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信