golang的error wrapping

本文介绍Go1.13中errorwrapping功能,通过fmt.Errorf与%w组合生成嵌套错误,增强了错误处理能力。展示了自定义错误类型MyError及如何使用errors包的Unwrap、Is和As函数进行错误解析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我们都知道error用处特别多,但是golang官方提供的error类型功能实在太单一了,只能打印错误提示字符串。不过在Go1.13版本后对error功能进行了增强,也就是今天要提到的error wrapping。

error wrapping的原理非常简单,通过fmt.Errorf + %w的组合生成一个嵌套的error。通过多次调用生成多层嵌套error。

同时errors包还提供了三个好用的函数,全列在下面的图里。

最后我写了个demo测试了一下,确实很好用:

type MyError struct {
	s string
	code int
}

func NewMyError(s string, code int) MyError {
	return MyError{s, code}
}

func (me MyError) Error() string {
	return me.s
}

func (me MyError) Code() int {
	return me.code
}

func main() {
	myErr := NewMyError("not found", 404)
	wrapp1Err := fmt.Errorf("this is a wrapping1 error:%w", myErr)
	wrapp2Err := fmt.Errorf("this is a wrapping2 error:%w", wrapp1Err)
	fmt.Println(errors.Unwrap(wrapp2Err))
	fmt.Println(errors.Is(wrapp2Err, myErr))
	if target,ok := wrapp2Err.(MyError); ok {
		fmt.Println("type assert success:",target.Error())
	}
	var target MyError
	if errors.As(wrapp2Err, &target) {
		fmt.Println("as success:",target.Code())
	}
}

(全文完)

参考链接:

https://mp.weixin.qq.com/s?__biz=MzI3MjU4Njk3Ng==&mid=2247484274&idx=1&sn=aa4e64d33030156f5b7c27bb8ac5da25&chksm=eb3102fddc468bebbc311726cef246a471a639709837222ea639e5469a0ab133b6c71d18db5e&scene=27#wechat_redirect

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值