error 是一个内置的接口(见源码的 builtin/builtin.go 文件):
type error interface {
Error() string
}
很多包里面都有自定义的 error。其中内置的 errors
包里面提供了一个简单通用的实现 error 接口的结构体:
package errors
func New(text string) error {
return &errorString{text}
}
type errorString struct {
s string
}
func (e *errorString) Error() string {
return e.s
}
示例1:
package main
import (
"errors"
)
func main() {
var err error = errors.New("出现错误")
panic(err) // panic 会终止程序运行,并打印错误堆栈
}
执行后报错如下:
panic: 出现错误
goroutine 1 [running]:
main.main()
/path/to/learn_error.go:9 +0x71
示例2:通过 error 的 Error 方法获取错误信息字符串
package main
import (
"errors"
"fmt"
)
func main() {
var err error = errors.New("出现错误")
var errMsg string = err.Error()
fmt.Println(err)
fmt.Println(errMsg)
}
运行结果:
出现错误
出现错误
示例3:
package main
import "fmt"
func checkError(err error) {
if err != nil {
panic(err)
}
}
func main() {
checkError(nil) // 不会报错
fmt.Println("Hello")
}
运行结果:
Hello
示例4:
package main
import (
"errors"
)
func checkError(err error) {
if err != nil {
panic(err)
}
}
func main() {
var err error = errors.New("出现错误")
checkError(err)
}
运行结果:
panic: 出现错误
goroutine 1 [running]:
main.checkError(...)
/path/to/learn_error.go:8
main.main()
/path/to/earn_error.go:14 +0x72