Go Wiki: 错误

错误是通过将 error 作为函数的附加返回值来指示的。nil 值表示没有错误。

可以通过调用 error(它们唯一的函数)将其转换为字符串。你可以通过调用 errors.New 来从字符串创建错误

if failure {
    return errors.New("inverse tachyon pulse failed")
}

或使用 fmt.Errorf

if failure {
    return fmt.Errorf("inverse tachyon pulse failed")
}

错误字符串不应以大写字母开头,因为打印时它们通常会被添加前缀。

err := TryInverseTachyonPulse()
if err != nil {
    fmt.Printf("failed to solve problem: %s\n", err)
}

如果你希望调用代码能够处理错误,你可以通过返回特殊值或新类型来区分错误类别。你只需要区分调用代码可能需要以这种方式处理的差异,因为字符串允许传达错误的详细信息。

io.EOF 是一个表示流结束的特殊值。你可以直接将错误值与 io.EOF 进行比较。

如果你想携带错误的额外数据,你可以使用新类型。

type ParseError struct {
    Line, Col int
}

func (p ParseError) Error() string {
    return fmt.Sprintf("parse error on line %d, column %d", p.Line, p.Col)
}

如果你想创建一个常量字符串错误,你可以使用命名类型字符串。

type errorConst string

const ErrTooManyErrors errorConst = "too many errors found."

func (e errorConst) Error() string {
    return string(e)
}

调用代码会使用类型开关来测试一种特殊的 error 类型。

switch err := err.(type) {
case ParseError:
    PrintParseError(err)
}

命名

错误类型以 "Error" 结尾,错误变量以 "Err""err" 开头。

package somepkg

// ParseError is type of error returned when there's a parsing problem.
type ParseError struct {
  Line, Col int
}

var ErrBadAction = errors.New("somepkg: a bad action was performed")

// -----

package foo

func foo() {
    res, err := somepkgAction()
    if err != nil {
        if err == somepkg.ErrBadAction {
        }
        if pe, ok := err.(*somepkg.ParseError); ok {
             line, col := pe.Line, pe.Col
             // ....
        }
    }
}

参考


此内容是 Go Wiki 的一部分。