Go 语言通过内置的错误接口提供了非常简单的错误处理机制。
Go 语言的错误处理采用显式返回错误的方式,而非传统的异常处理机制。这种设计使代码逻辑更清晰,便于开发者在编译时或运行时明确处理错误。
Go 的错误处理主要围绕以下机制展开:
error 接口
Go 标准库定义了一个 error 接口,表示一个错误的抽象。
error 类型是一个接口类型,这是它的定义:
type error interface { Error() string }
使用 errors 包创建错误
我们可以在编码中通过实现 error 接口类型来生成错误信息。
创建一个简单错误:
实例
函数通常在最后的返回值中返回错误信息,使用 errors.New 可返回一个错误信息:
func Sqrt(f float64) (float64, error) { if f < 0 { return 0, errors.New("math: square root of negative number") } // 实现 }
在下面的例子中,我们在调用 Sqrt 的时候传递的一个负数,然后就得到了 non-nil 的 error 对象,将此对象与 nil 比较,结果为 true,所以 fmt.Println(fmt 包在处理 error 时会调用 Error 方法)被调用,以输出错误,请看下面调用的示例代码:
result, err:= Sqrt(-1) if err != nil { fmt.Println(err) }
显式返回错误
Go 中,错误通常作为函数的返回值返回,开发者需要显式检查并处理。
显式返回错误:
输出:
Error: division by zero
自定义错误
通过定义自定义类型,可以扩展 error 接口。
自定义错误类型:
fmt 包与错误格式化
fmt 包提供了对错误的格式化输出支持:
执行以上程序,输出结果为:
100/10 = 10 errorMsg is: Cannot proceed, the divider is zero. dividee: 100 divider: 0
使用 errors.Is 和 errors.As
从 Go 1.13 开始, errors 包引入了 errors.Is 和 errors.As 用于处理错误链:
errors.Is
检查某个错误是否是特定错误或由该错误包装而成。
errors.As
将错误转换为特定类型以便进一步处理。
panic 和 recover
Go 的 panic 用于处理不可恢复的错误,recover 用于从 panic 中恢复。
panic:
recover:
执行以上代码,输出结果为:
Starting program... Recovered from panic: something went wrong Program continued after panic