0%

golang 中 error 处理

创建error

通常在golang中用下面方式创建error

1. fmt.Errorf

1
2
3
func action() error {
return fmt.Errorf("sth went wrong")
}

2. errors.New

1
2
3
func action() error {
return errors.New("sth went wrong")
}

3. 实现error 接口

上面两种创建方式都是使用 errors 进行创建的
errors 实现了 error 接口

1
2
3
type error interface {
Error() string
}

如果我们需要自定义error 的类型,就需要实现 error 接口

1
2
3
4
5
6
7
type MyError struct {
Msg string
}

func (e MyError)Error() string{
return e.Msg
}

编写约定

golang 约定了error中的string:首母小写,结尾不带标点

1
2
err := errors.New("sth went wrong")
fmt.Printf("The returned error is %s.\n", err)

处理异常

是否有异常

1
2
3
if err != nil {
//handle error
}

是否有特定的异常

通常在程序中会自定义一系列的异常,方便细化处理

全局变量

1
2
3
4
5
6
7
// src/os/error.go
var (
ErrInvalid = errors.New("invalid argument")
ErrPermission = errors.New("permission denied")
ErrExist = errors.New("file already exists")
ErrNotExist = errors.New("file does not exist")
)

如果os 包的方法有异常,就可以直接进行比较

1
2
if err == os.ErrInvalid {
}

实现error 接口

当需要记录更多异常信息时就要自己实现error 接口
这种情况下可以用类型判断来区分error
下面是个🌰

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
type MyError struct {
Msg string
}

func (e MyError)Error() string{
return e.Msg
}

// SomeFunc 会return error
func SomeFunc() error{
return MyError{"bad things happen"}
}

func main() {
err := SomeFunc()

// 使用 switch
switch err.(type){
case MyError:
println("MyErr: " + err.Error())
case error:
println("error: " + err.Error())
}

// 使用 assert
if _, ok := err.(MyError); ok {
println("TypeAssert: " + err.Error())
}
}