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 ")