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  }