處理錯誤

在 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
}