Golang中的错误处理

本文介绍了Golang中的错误处理机制,包括error接口、构造error、自定义error、wrap和unwrap,以及errors包中的Unwrap、Is和As函数的用法。通过错误wrapping,可以跟踪错误源头,而errors包中的函数提供了判断和转换错误的便利。
摘要由CSDN通过智能技术生成

Golang 错误处理

go的错误处理与其他一些主流编程语言具有本质的区别,go的内嵌类型error不含有stack trace,也不支持传统的 try/catch 语句模型。go中的错误只是函数返回的一个正常的变量值,对待错误也能像对待普通变量一样,go的这种错误模型带来了更轻易、更简便的程序设计风格。

error interface

builtin.go中包含下述的一个接口类型:

// 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 一般有两种方法:errors.New("")fmt.Errorf(""),区别是:

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

  2. fmt.Errorf可以利用format的方式构造字符串

自定义error

自定义 error 只要实现 builtin.go 中的 error 接口就可以向上兼容 error。同时我们可以利用 go 嵌套接口的方法去定义一个我们自己的 error 接口:

type myErr interface {
    error
    Desc()   string
    String() string
}

再定义结构体去实现该接口,我们就有了自己定义的 custom error了。

wrap 和 unwrap

有一定的 golang 编程经历的同学会发现,error 没有stack trace的特性会导致程序中的错误比较难以跟踪。为了解决这种问题就出现了 error wraping 的一种操作。如果你查看 fmt.Errorf 的源代码,你会明显的发现 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()
	
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值