Skip to content

错误

使用 Go 内置接口 error 表达错误状态,类似于 Stringer 描述自身:

go
type error interface {
    Error() string
}

实现 error 接口的类型一般会返回 error 值,具体类型是字符串,调用代码应该通过测试错误是否等于 nil 来处理错误。

go
i, err := strconv.Atoi("42")
if err != nil {
    fmt.Printf("couldn't convert number: %v\n", err)
    return
}
fmt.Println("Converted integer:", i)

简单示例

go
package main

import (
	"fmt"
	"time"
)

type MyError struct {
	When time.Time
	What string
}

func (e *MyError) Error() string {
	return fmt.Sprintf("at %v, %s",
		e.When, e.What)
}

func run() error {
	return &MyError{
		time.Now(),
		"it didn't work",
	}
}

func main() {
	if err := run(); err != nil {
		fmt.Println(err)
	}
}

复杂示例

go
package main

import (
	"fmt"
)

type ErrNegativeSqrt float64

func (e ErrNegativeSqrt) Error() string {
	// 注意:这里必须将 e 转换为 float64,否则 fmt.Sprint(e) 会无限递归调用 Error()
	return fmt.Sprintf("cannot Sqrt negative number: %v", float64(e))
}

func Sqrt(x float64) (float64, error) {	// 返回两个数值
	if x < 0 {
		return 0, ErrNegativeSqrt(x) // 返回错误
	}
	z := 1.0
	for i := 0; i < 10; i++ {
		z -= (z*z - x) / (2 * z)
	}
	return z, nil
}

func main() {
	fmt.Println(Sqrt(2))
	fmt.Println(Sqrt(-2))
}