package main
import (
"errors"
"fmt"
)
// 按照惯例,错误通常是最后一个返回值并且是 error 类型
func f1(arg int) (int, error) {
if arg == 42 {
//errors.New 使用给定的错误信息构造一个基本的 error 值
return -1, errors.New("can not work whit 42")
}
//返回错误值为 nil 代表没有错误
return arg + 3, nil
}
// 通过实现 Error() 方法来自定义 error 类型。 这里使用自定义错误类型来表示上面例子中的参数错误
type defError struct {
arg int
prob string
}
func (de *defError) Error() string {
//fmt.Sprintf 来格式化字符串
return fmt.Sprintf("%d - %s", de.arg, de.prob)
}
// 使用 &argError 语法来建立一个新的结构体, 并提供了 arg 和 prob 两个字段的值
func f2(arg int) (int, error) {
if arg == 42 {
return -1, &defError{arg, "can not work with it"}
}
return arg + 3, nil
}
func main() {
//下面的两个循环测试了每一个会返回错误的函数。 注意,在 if 的同一行进行错误检查,是 Go 代码中的一种常见用法
for _, a := range []int{3, 42} {
if re, p := f1(a); p != nil {
fmt.Println("f1 fail:", p)
} else {
fmt.Println("f1 work:", re)
}
}
for _, a := range []int{3, 42} {
if re, p := f2(a); p != nil {
fmt.Println("f2 fail:", p)
} else {
fmt.Println("f2 work:", re)
}
}
//如果你想在程序中使用自定义错误类型的数据, 你需要通过类型断言来得到这个自定义错误类型的实例
_, r := f2(42)
//类型断言value.(type)
if d, ok := r.(*defError); ok {
fmt.Println(d.arg)
fmt.Println(d.prob)
}
}
Go 错误处理
于 2023-04-11 15:52:39 首次发布