其中哪些是错误处理的正确方法

时间:2019-08-23 05:50:34

标签: go

我处于一个可以返回多达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 个答案:

答案 0 :(得分:1)

在编码时问一个很好的问题,但是没有一个完美的答案。通常,在Go中通常会像方法1或方法3一样处理错误。

如果需要,您可以参考https://blog.golang.org/error-handling-and-go

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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

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的作用域已定。