我已经为独立和嵌入式使用创建了一个"基础"存储库结构(例如,使用CustomerRepository),以避免不断检查错误,并为Gorp(数据库工具包)创建抽象,并创建一个更多的API我很喜欢.
我检查了这个基本结构中的错误,如果发现了一个就发生了恐慌,就像我认为它确实存在一样,然后它表示一个dev错误,代码可能也会出现恐慌,因为在数据进入存储库之前会发生验证等问题. .
我发现了这个问题Go Error Handling Techniques,但它没有涵盖像我一样在基础结构中包装错误而只是恐慌.
我做了什么惯用Go?
package repositories
import (
"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{}) …Run Code Online (Sandbox Code Playgroud) 有没有办法清理这个(IMO)可怕的代码?
aJson, err1 := json.Marshal(a)
bJson, err2 := json.Marshal(b)
cJson, err3 := json.Marshal(c)
dJson, err4 := json.Marshal(d)
eJson, err5 := json.Marshal(e)
fJson, err6 := json.Marshal(f)
gJson, err4 := json.Marshal(g)
if err1 != nil {
return err1
} else if err2 != nil {
return err2
} else if err3 != nil {
return err3
} else if err4 != nil {
return err4
} else if err5 != nil {
return err5
} else if err5 != nil {
return …Run Code Online (Sandbox Code Playgroud) 刚开始使用Golang.我认为声明一个错误变量并在你的错误结构中使用它来确定出错了是不恰当的,就像在strconv.go中所做的那样.在那里,ErrRange并且ErrSyntax被声明,并且在适当的时候,对它们的引用NumError在它们返回时存储在结构中.我认为原因是因为存储的错误引用的地址NumError可以与ErrRange和ErrSyntax变量进行比较,以确定返回哪种类型的错误.
是否存在"标准"声明的错误类型?例如,在Java中,你有类似的东西java.lang.IllegalArgumentException.例如,ErrArgument或者ErrUnsupportedOperation我可以在我自己的代码中使用,而不是每次创建意味着相同的新错误变量?
我最近进入Go并看到了很多关于如何进行错误处理的讨论.
我看到的模式如下:
err := DoSomething()
if err != nil {
//handle
}
// continue
Run Code Online (Sandbox Code Playgroud)
经常在管理amqp连接时,我的条件是我只想在错误为nil时继续,因为那时我需要在连接上做一些事情:
c, err := Connect()
if err != nil {
return nil, err
}
s,err := c.RegisterSomethingOnConnection()
if err != nil {
return nil, err
}
val, err := s.DoSomething()
return val, err
Run Code Online (Sandbox Code Playgroud)
正如你所看到的,c.RegisterSomethingOnConnection如果返回的错误Connect()是nil,我只想运行该行.
但是,由于提前退货,我不喜欢上述情况.早期的回报让我感到不舒服,因为从长远来看,它会损害可读性,并且在功能退出时会完全模糊.到目前为止,我的解决方案是执行以下操作:
var err error
var val ReturnType
c,err := Connect()
if err == nil {
s,err := c.RegisterSomethingOnConnection()
if err == nil {
val,err = s.DoSomething()
}
} …Run Code Online (Sandbox Code Playgroud) 我写了一个函数,应该做一件简单的事情:
作为 RDMS,我在这里使用 mysql。我将所有内容都放在事务中,以避免调用此函数的并发 go 例程中出现竞争条件。
然而,大量的持续检查使err代码变得丑陋,并且很难获得完整的测试覆盖率。
在提高代码质量方面我可以改进什么吗?
func getAddressId(db *sql.DB, address string) (int64, error) {
tx, err := db.Begin()
if err != nil {
tx.Rollback()
return 0, err
}
stmt, err := tx.Prepare("SELECT id FROM address WHERE `address`=?")
if err != nil {
tx.Rollback()
return 0, err
}
defer stmt.Close()
var result sql.NullInt64
err = stmt.QueryRow(address).Scan(&result)
if err != nil && err != sql.ErrNoRows {
tx.Rollback()
return 0, err
}
if result.Valid …Run Code Online (Sandbox Code Playgroud)