1. 程式人生 > >golang 列印error的堆疊資訊

golang 列印error的堆疊資訊

眾所周知,目前的golang error只關注Error()資訊,而不關注它的堆疊路徑,對錯誤的定位大多數通過

	log.SetFlags(log.Llongfile| log.LstdFlags)
	log.Println(e)

一旦程式碼分層,為了定位錯誤,可能出現每一個層次的同一個error,都得log好幾次,比如:

func DB()error{
	return errors.New("time out")
}
func Dao()error{
    if er:= DB();er!=nil{
    	 log.Println(er)
    	 return
error } return nil } func Service()error{ if er:= Dao();er!=nil{ log.Println(er) return error } return nil } func Control()error{ if er:= Service();er!=nil{ log.Println(er) return error } return nil }

如何一次性丟擲錯誤,把該錯誤的堆疊全部都拿住呢

以模擬一次請求-分發-服務-資料庫操作為例:

package main

import (
	"errors"
	"fmt"
	"github.com/fwhezfwhez/errorx"
)

func main() {
	if e := Control(); e != nil {
		e.(errorx.Error).PrintStackTrace()
		// log.Println(e.(errorx.Error).StackTrace())
	} else {
		Reply()
	}
}

// assume an engine to connect mysql
func DB() error {
	return errors.New
("connect to mysql time out") } // handle database operation func Dao() error { if er := DB(); er != nil { return errorx.New(er) } return nil } // handle logic service func Service() error { if er := Dao(); er != nil { return errorx.Wrap(er) } return nil } // handle request distribute from main func Control() error { if er := Service(); er != nil { return errorx.ReGen(er, errors.New("inner service error,please call admin for help")) } return nil } // reply a the request func Reply(){ fmt.Println("handle success") }

執行結果:

StackTrace | CausedBy
G:/go_workspace/GOPATH/src/errorX/example/main.go: 26 | connect to mysql time out
G:/go_workspace/GOPATH/src/errorX/example/main.go: 34 | connect to mysql time out
G:/go_workspace/GOPATH/src/errorX/example/main.go: 42 | inner service error,please call admin for help