Go语言错误处理笔记

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

一、常见的使用方法

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
func add(a, b int) (int, error) {
	if a < 0 || b < 0 {
		return 0, errors.New("传入参数不能为负数")
	}
	return a + b, nil
}

func main() {
	sum, err := add(1, -2)
	if err != nil {
		fmt.Println(err)
	} else {
		fmt.Println(sum)
	}
}

二、Error Wrapping

1
2
3
4
5
6
func main() {
	e := errors.New("原始error")
	e1 := fmt.Errorf("Wrap一个error:%w", e)
	fmt.Println(e1) // Wrap一个error:原始error

}

使用这种方式可以对原有的error进行修饰 errors.Unwrap(e error) 可以获取被嵌套的error

1
2
3
4
5
6
7
func main() {
	e := errors.New("原始error")
	e1 := fmt.Errorf("Wrap一个error:%w", e)
	e2 := errors.Unwrap(e1)
	fmt.Println(e2) //原始error

}

errors.IS(e1,e2 error) 可以判断被嵌套的error是不是原有的error

1
2
3
4
5
6
7
8
func main() {
	e := errors.New("原始error")
	e1 := fmt.Errorf("Wrap一个error:%w", e)
	fmt.Println(errors.Is(e, e1)) //false
	e2 := fmt.Errorf("又Wrap一个error:%w", e1)
	fmt.Println(errors.Is(e2, e1)) //true
	fmt.Println(errors.Is(e2, e))  //true
}