Skip to content

老陈是一个普通的文艺二逼青年

For The Dream

golang标准库 —— errors包

Written by chen

error 接口

Go语言引入了一个关于错误处理的标准模式,即error接口,该接口定义:

1
2
3
4
5
# builtin/builtin.go
type error interface {
    Error() string
}
 

对于大多数函数,如果要返回错误,大致可以定义为如下模式,将error作为多种返回值中的最后一个,但这并非是强制要求:

1
2
3
4
func Foo(param int)(n int, err error) {
    // ...  
}
 

通过errors下的New方法可以创建一个错误:

1
2
3
4
5
6
import "errors"
 
func Foo(param int)(n int, err error) {
    return 0, errors.New("this is a error")
}
 

error 源码分析

errors/errors.go下定义了errorString,并且让其实现了Error方法。

1
2
3
4
5
6
7
8
9
type errorString struct {
    s string
}
 
func (e *errorString) Error() string {
    return e.s
}
 
 

所以New方法创建的errorString是一个error类型。

1
2
3
4
5
6
#errors/errors.go
 
func New(text string) error {
    return &errorString{text}
}
 

实现自己的错误类型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
type MyError struct {
    When time.Time
    What string
}
 
func (e MyError) Error() string {
    return fmt.Sprintf("%v: %v", e.When, e.What)
}
 
func hello() error {
    return MyError{
        time.Date(2018, 3, 15, 22, 30, 0, 0, time.UTC),
        "this is my error",
    }
 
 

golang · golang

Copyright © 2022 老陈是一个普通的文艺二逼青年. 沪ICP备13044041号-1