Golang 错误处理
go的错误处理与其他一些主流编程语言具有本质的区别,go的内嵌类型error不含有stack trace,也不支持传统的 try/catch 语句模型。go中的错误只是函数返回的一个正常的变量值,对待错误也能像对待普通变量一样,go的这种错误模型带来了更轻易、更简便的程序设计风格。
error interface
中包含下述的一个接口类型:
// The error built-in interface type is the conventional interface for
// representing an error condition, with the nil value representing no error.
type error interface {
Error() string
}
go中的 error
接口只有一个方法 Error
返回一个字符串,该字符串就可以包含该错误的内部信息,没有任何其他方法,错误就是这么简单!
构造 error
构造 error 一般有两种方法:("")
、("")
,区别是:
-
的参数只能传入字符串常量
-
可以利用format的方式构造字符串
自定义error
自定义 error 只要实现 中的 error 接口就可以向上兼容 error。同时我们可以利用 go 嵌套接口的方法去定义一个我们自己的 error 接口:
type myErr interface {
error
Desc() string
String() string
}
再定义结构体去实现该接口,我们就有了自己定义的 custom error了。
wrap 和 unwrap
有一定的 golang 编程经历的同学会发现,error 没有stack trace的特性会导致程序中的错误比较难以跟踪。为了解决这种问题就出现了 error wraping 的一种操作。如果你查看 的源代码,你会明显的发现 error wraping 最简单的原理:
func Errorf(format string, a ...any) error {
p := newPrinter()
p.wrapErrs = true
p.doPrintf(format, a)
s := string(p.buf)
var err error
if p.wrappedErr == nil {
err = errors.New(s)
} else {
err = &wrapError{
s, p.wrappedErr}
}
p.free()