处理错误

在 Go 中,可以从函数调用返回错误。惯例是,如果方法可能失败,则最后返回的参数是 error

func DoAndReturnSomething() (string, error) {
    if os.Getenv("ERROR") == "1" {
        return "", errors.New("The method failed")
    }

    // The method succeeded.
    return "Success!", nil
}

你使用多个变量赋值来检查方法是否失败。

result, err := DoAndReturnSomething()
if err != nil {
    panic(err)
}

// This is executed only if the method didn't return an error
fmt.Println(result)

如果你对错误不感兴趣,可以通过将其分配给 _ 来忽略它。

result, _ := DoAndReturnSomething()
fmt.Println(result)

当然,忽略错误会产生严重影响。因此,通常不建议这样做。

如果你有多个方法调用,并且链中的一个或多个方法可能返回错误,则应将错误传播到可以处理它的第一级。

func Foo() error {
    return errors.New("I failed!")    
}

func Bar() (string, error) {
    err := Foo()
    if err != nil {
        return "", err
    }

    return "I succeeded", nil
}

func Baz() (string, string, error) {
    res, err := Bar()
    if err != nil {
        return "", "", err
    }

    return "Foo", "Bar", nil
}