1 回答
TA贡献1831条经验 获得超10个赞
你不能用这个github.com/pkg/errors函数真正做到这一点。这是因为用于包装的错误类型未导出,因此您无法将其嵌入到您自己的自定义错误中。
但是,鉴于您不反对使用 stdliberrors包以外的错误库,以下是使用juju 错误包的方法(因为它的 Err 类型已导出):
package main
import (
"fmt"
"github.com/juju/errors"
)
type temporary interface {
Temporary() bool
}
func IsTemporary(err error) bool {
for {
te, ok := err.(temporary)
if ok {
return te.Temporary()
}
er, ok := err.(*errors.Err)
if ok {
err = er.Underlying()
continue
}
return false
}
}
type MyError struct {
errors.Err
isTemporary bool
}
func (e MyError) Temporary() bool {
return e.isTemporary
}
func f1() error { // imitate a function from another package, that produces an error
return errors.Errorf("f1 error")
}
func f2() error {
err := f1()
wrappedErr := errors.Annotate(err, "f2 error")
return &MyError{
Err: *wrappedErr.(*errors.Err),
isTemporary: true,
}
}
func f3() error {
err := f2()
return errors.Annotate(err, "f3 error")
}
func f4() error {
err := f3()
return errors.Annotate(err, "f4 error")
}
func main() {
err := f4()
if err != nil {
if IsTemporary(err) {
fmt.Println("temporary error")
}
if e, ok := err.(*errors.Err); ok {
fmt.Printf("oops: %+v\n", e.StackTrace())
}
}
}
- 1 回答
- 0 关注
- 84 浏览
添加回答
举报