首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Golang惯用错误处理

Golang惯用错误处理
EN

Stack Overflow用户
提问于 2014-01-22 01:47:11
回答 2查看 10.5K关注 0票数 10

我创建了一个用于独立和嵌入式使用的“基础”存储库结构(例如,使用CustomerRepository),以避免所有时间都必须检查错误,并为Gorp (数据库工具包)创建一个抽象,并创建一个稍微更符合我的喜好的应用程序接口。

我检查这个基本结构中的错误,如果发现一个错误,就会恐慌,就像在我看来确实存在一个错误一样,然后指示开发错误,代码也可能会恐慌,因为验证等应该在数据到达存储库之前发生。

我发现了这个问题Go Error Handling Techniques,但它并没有像我所做的那样,将错误包装在一个基本结构中,只是惊慌失措。

我所做的是地道的Go吗?

代码语言:javascript
复制
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
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-01-22 01:56:00

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

代码语言:javascript
复制
func (list ...interface{}) (v int46, err error) {}

..。然后在调用这些函数的位置检查err != nil。

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

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

票数 10
EN

Stack Overflow用户

发布于 2014-05-30 20:29:23

不要惊慌,这不是最好的方法。相反,做一些像这样的事情--

代码语言:javascript
复制
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处理程序中使用这些函数,所以您应该这样做--

代码语言:javascript
复制
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确实返回您在包中声明的特定错误。

代码语言:javascript
复制
var ErrNotFound = errors.New("not found")

创建尽可能多的对您的代码有意义的代码。

票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21265464

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档