登录
首页 >  Golang >  Go问答

常用的在 Golang 中返回未找到错误的方法有哪些?

来源:stackoverflow

时间:2024-02-14 20:30:24 171浏览 收藏

Golang小白一枚,正在不断学习积累知识,现将学习到的知识记录一下,也是将我的所得分享给大家!而今天这篇文章《常用的在 Golang 中返回未找到错误的方法有哪些?》带大家来了解一下##content_title##,希望对大家的知识积累有所帮助,从而弥补自己的不足,助力实战开发!


问题内容

我在 go 中有一个带有此签名的函数:

func getaccount(ctx context.context, id uuid.uuid) (*account, error)

如果存在内部错误(例如数据库查询由于某种原因失败),它会返回错误,但我不确定如果找不到帐户应该返回什么。我可以想到两种不同的方法:

  1. 如果没有找到帐户,则返回一个 nil 帐户并返回 nil 错误
  2. 返回如下所示的自定义错误类型:
type accountNotFoundErr struct {
    id uuid.UUID
}

func (err accountNotFoundErr) Error() string {
    return fmt.Sprintf("account not found for user: %v", err.id)
}

func IsAccountNotFoundErr(err error) bool {
    _, ok := err.(accountNotFoundErr)
    return ok
}

func GetAccount(ctx context.Context, id uuid.UUID) (*Account, error) {
    // if the account is not found
    return nil, accountNotFoundErr{id}
}

我喜欢第一个,因为它很简单,但我不经常看到如果错误非零则返回零结果的 go 代码。我认为期望的是,如果错误为零,则结果有效。第二种方法解决了这个问题,但对于调用者来说也有点复杂。

在 go 中处理此类情况的惯用方法是什么?


正确答案


我读过很多关于 go 中自定义错误的文章。他们中的大多数创建了自己的结构来实现错误接口。

我发现这种方法的问题是我无法轻松检查错误是否属于某种类型。同样,您也许可以检查一些标准库错误,例如 if error == eof

因此,我最喜欢的方法是使用 erros.new 创建一个简单的 var。

var errnotfound = errors.new("resource was not found")

func main() {
    err := raise()
    if err == errnotfound {
        fmt.println("impossibru")
        return
    }
    if err != nil {
        fmt.println("unexpected error")
        return
    }
}

func raise() error {
    return errnotfound
}

https://play.golang.com/p/s0ZQfsdLqxB

正如 @gavin 在评论中指出的,如果您想通过使用 fmt.errorf 包装错误来提供更多上下文,则需要使用 errors.is 来检查特定错误是否已包装。

var ErrNotFound = errors.New("Resource was not found")

func main() {
    err := raise(42)
    if errors.Is(err, ErrNotFound) {
        fmt.Println(err)
        return
    }
    if err != nil {
        fmt.Println("unexpected error")
        return
    }
}

func raise(id int) error {
    return fmt.Errorf("id %d does not exist, error: %w", id, ErrNotFound)
}

https://play.golang.com/p/hSrkb1Xp4Hn

今天关于《常用的在 Golang 中返回未找到错误的方法有哪些?》的内容就介绍到这里了,是不是学起来一目了然!想要了解更多关于的内容请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>