github.com/samcsf/daily-go@v0.0.0-20190829154117-7da5420f3392/pkg/pkg-error-example/main.go (about) 1 package main 2 3 import ( 4 "fmt" 5 "github.com/pkg/errors" 6 ) 7 8 type stackTracer interface { 9 StackTrace() errors.StackTrace 10 } 11 12 func main() { 13 // Wrap 方法将每一层的信息包裹起来,包括stack 14 e := a() 15 if e != nil { 16 fmt.Println(e) 17 } 18 19 // 因为返回的是error interface所以对自定义error进行方法调用之前要使用type assert 20 // StackTrace + "%+v" 能输出具体到文件行数的信息 21 err, ok := errors.Cause(e).(stackTracer) 22 if !ok { 23 panic("err does not implement stackTrace()") 24 } 25 st := err.StackTrace() 26 fmt.Printf("%+v", st) 27 } 28 29 func a() error { 30 e1 := b() 31 if e1 != nil { 32 return errors.Wrap(e1, "error in a() calling b()") 33 } 34 e2 := c() 35 if e2 != nil { 36 return errors.Wrap(e2, "error in a() calling c()") 37 } 38 return nil 39 } 40 41 func b() error { 42 return nil 43 } 44 45 func c() error { 46 e := d() 47 return errors.Wrap(e, "error in c()") 48 } 49 50 func d() error { 51 return errors.Wrap(errors.New("my error"), "error in d()") 52 }