我创建了一个用于独立和嵌入式使用的“基础”存储库结构(例如,使用CustomerRepository),以避免所有时间都必须检查错误,并为Gorp (数据库工具包)创建一个抽象,并创建一个稍微更符合我的喜好的应用程序接口。
我检查这个基本结构中的错误,如果发现一个错误,就会恐慌,就像在我看来确实存在一个错误一样,然后指示开发错误,代码也可能会恐慌,因为验证等应该在数据到达存储库之前发生。
我发现了这个问题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{}) {
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
}发布于 2014-01-22 01:56:00
惯用的方法是返回带有相关类型值的错误,即
func (list ...interface{}) (v int46, err error) {}..。然后在调用这些函数的位置检查err != nil。
最终,使用panic()将导致类似异常的错误处理和更多的样板代码(如果您认为错误是可以恢复的)。
惯用的错误处理在Go中是冗长的,但比模拟异常要少(这基本上不是"Go方式“)。
发布于 2014-05-30 20:29:23
不要惊慌,这不是最好的方法。相反,做一些像这样的事情--
func (r *Repository) GetById(i interface{}, id int) (interface{}, error) {
obj, err := r.Gorp.Get(i, id)
if err != nil {
return nil, err
}
return obj, nil
}然后只需处理调用者中的错误。我从您上面的注释中看到,您正在Martini处理程序中使用这些函数,所以您应该这样做--
func MyHandler(parameters) (int, string) {
obj, err := repository.GetById(something, id)
if err == repository.ErrNotFound {
return http.StatusNotFound, fmt.Sprintf("could not find by id: %d", id)
}
if err != nil {
return http.StatusInternalError, err.Error()
}
return http.StatusOk, fmt.Printf("obj: %v", obj)
}这更像是Go的方式。确保r.Gorp.Get确实返回您在包中声明的特定错误。
var ErrNotFound = errors.New("not found")创建尽可能多的对您的代码有意义的代码。
https://stackoverflow.com/questions/21265464
复制相似问题