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

我的情况是,我有一个函数可以返回最多 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

        }

    }


holdtom
浏览 146回答 3
3回答

忽然笑

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

一只甜甜圈

最后一个例子是我在大多数地方看到的。例如https://github.com/kubernetes/kubernetes/blob/master/cmd/genutils/genutils.go编译器不会将其检测为重新定义,因为该表达式至少有一个新变量。

慕神8447489

给出最后一个例子,一个解决方案是不使用命名返回变量,并为每个功能块引入作用域package mainfunc 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 已经确定了变量的作用域。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go