Golang中的错误处理

时间:2024-10-11 07:42:58

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 一般有两种方法:("")(""),区别是:

  1. 的参数只能传入字符串常量

  2. 可以利用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()