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

其中哪一个是进行错误处理的正确方法

其中哪一个是进行错误处理的正确方法

Go
holdtom 2023-07-17 14:21:04
我的情况是,我有一个函数可以返回最多 5 个不同的错误,但我不确定按照 Go 的惯例,哪个函数被认为是正确的。我在下面做了一个小的 MSVC 示例来说明我的问题。使用 if 语法来阻止我的错误。if err := validatePassword(password); err != nil {    return err}if passwordHash, err := bcrypt.GenerateFromPassword([]byte(password), bcrypt.DefaultCost); err != nil {    return err}或者以不同的方式命名每个错误(看起来很麻烦......)errValidatePassword := validatePassword(password)if errValidatePassword != nil {    return errValidatePassword}passwordHash, errPasswordHash := bcrypt.GenerateFromPassword([]byte(password), bcrypt.DefaultCost)if errPasswordHash != nil {    return errPasswordHash}或者使用命名返回。func registerAccount(email string, password string) (err error) {    err = validatePassword(password)    if err != nil {        return err    }    // POSSIBLE ISSUE HERE as err already been inistalised????        passwordHash, err := bcrypt.GenerateFromPassword([]byte(password), bcrypt.DefaultCost)        if err != nil {            return err        }    }
查看完整描述

3 回答

?
忽然笑

TA贡献1806条经验 获得超5个赞

这是在编码时提出的一个好问题,但没有一个完美的答案。一般来说,像方法 1 或方法 3 这样的就地处理错误是 Go 中的常见做法。

查看完整回答
反对 回复 2023-07-17
?
一只甜甜圈

TA贡献1836条经验 获得超5个赞

最后一个例子是我在大多数地方看到的。例如https://github.com/kubernetes/kubernetes/blob/master/cmd/genutils/genutils.go

编译器不会将其检测为重新定义,因为该表达式至少有一个新变量。


查看完整回答
反对 回复 2023-07-17
?
慕神8447489

TA贡献1780条经验 获得超1个赞

给出最后一个例子,一个解决方案是不使用命名返回变量,并为每个功能块引入作用域


package main


func registerAccount(email string, password string) error {


    if err := validatePassword(password); err != nil {

        return err

    }


    var passwordHash []byte

    {

        x, err := bcrypt.GenerateFromPassword([]byte(password), bcrypt.DefaultCost)

        if err != nil {

            return err

        }

        passwordHash = x

    }


    return nil

}

请注意,如果您充分利用了变量的语法,则 if 已经确定了变量的作用域。


查看完整回答
反对 回复 2023-07-17
  • 3 回答
  • 0 关注
  • 144 浏览
慕课专栏
更多

添加回答

举报

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