golang1.13版本errors新用法

本文介绍了Go语言中错误处理的常见操作,包括错误的创建、包装、拆解和判断。通过示例展示了如何使用`errors`包进行错误包装,以及如何使用`errors.Is`和`errors.As`进行错误检查和类型断言。此外,还探讨了Go1.13前后的错误处理差异。
摘要由CSDN通过智能技术生成

1创建一个被包装的 error

err1 := errors.New("new error")
err2 := fmt.Errorf("err2: [%w]", err1)
err3 := fmt.Errorf("err3: [%w]", err2)
fmt.Println(err3)

2. 拆开一个被包装的 error

err1 := errors.New("new error")
err2 := fmt.Errorf("err2: [%w]", err1)
err3 := fmt.Errorf("err3: [%w]", err2)

fmt.Println(errors.Unwrap(err3))
fmt.Println(errors.Unwrap(errors.Unwrap(err3)))
//output:
err2: [new error]
new error

3. 判断被包装的 error 是否是包含指定错误

err1 := errors.New("new error")
err2 := fmt.Errorf("err2: [%w]", err1)
err3 := fmt.Errorf("err3: [%w]", err2)

fmt.Println(errors.Is(err3, err2))
fmt.Println(errors.Is(err3, err1))
// output
true
true

4. 提取指定类型的错误或类型断言

type ErrorString struct {
    s string
}

func (e *ErrorString) Error() string {
    return e.s
}

var targetErr *ErrorString
err := fmt.Errorf("new error:[%w]", &ErrorString{s:"target err"})
fmt.Println(errors.As(err, &targetErr))
//output:
true

实例:

package main

import "fmt"
import "errors"

type ErrorString struct {
    s string
}

func (e *ErrorString) Error() string {
    return e.s
}

func main() {
	e := errors.New("原始错误e")
	
	w := fmt.Errorf("Wrap了一个错误%w", e)//加了一个%w来生成一个可以Wrapping Error,err赋值给e,
	
	fmt.Println(errors.Unwrap(w))//返回e
	
	fmt.Println(errors.Is(w,e))//Is用以判断嵌套情况下的两个error是否包含,func Is(err, target error) bool,如果err和target是同一个或err 是一个wrap error,target也包含在这个嵌套error链中的话,那么也返回true
	
	//在Go 1.13之前没有wrapping error的时候,我们要把error转为另外一个error,一般都是使用type assertion 或者 type switch,其实也就是类型断言
	//但是对于前提的方式,上述方式就不能用了,所以Golang为我们在errors包里提供了As函数。用于error的类型断言
	var targetErr *ErrorString
    err := fmt.Errorf("new error:[%w]", &ErrorString{s:"target err"})
    fmt.Println(errors.As(err, &targetErr))
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值