Go实现errors包

141 阅读1分钟

1.错误包应该具备的功能

1.1支持错误堆栈信息

`

package main  
  
import (  
"fmt"  
"log"  
)  
  
func main() {  
if FunA() != nil {  
log.Fatalf("call func got failed :%v", FunA())  
}  
log.Println("call func success")  
}  
  
func FunA() error {  
if err := FunB(); err != nil {  
return err  
}  
return fmt.Errorf("func called error")  
}  
  
func FunB() error {  
return fmt.Errorf("func called error")  
}

假设我们执行这个代码会报错

2023/06/29 00:20:12 call func got failed :func called error
Process finished with the exit code 1

此时我们不知道要怎么去排查报错,到底第几行在报错? 此时我我们就需要打印堆栈参数了,去定位第几行?

1.2支持不同的打印格式

例如%+v,%v,%s等格式,以便我们在代码里面排查

通过%+v可以打印堆栈参数,实现1.1的功能

1.3支持Wrap/Unwrap功能

错误包支持Wrap/Unwrap功能,就是在已有的错误上,追加一些新的信息,例如errors.Warp(err,"open file failed"),wrap功能同在在调用函数中,调用函数可以基础被调用函数的错误封装一些自己的信息,丰富报错信息,方便日后错误排查例如

func FunA() error {  
if err := FunB(); err != nil {  
return errors.Wrap(err,"call funB failed")  
}  
return fmt.Errorf("func called error")  
}  
  
func FunB() error {  
return fmt.Errorf("func called error")  
}

1.4有IS方法

在实际开发过程中,可能需要判断某个error是否是制定的error,我们之前是

if FunA() == os.ErrExist {  
  
}

但是现在,因为有了封装的errors包,这样的判断方法就会存在问题,因为你根本不知道你的error嵌套了多少层 所有就需要IS函数

func Is(err,target error) bool

5.支持AS函数

6.支持格式化和非格式化创建

例如:errors.New("file not found) 或者 errors.Errorf("file %s not found ","api ")